InfoCity

PHP3 для Windows

Bob Silva

Содержание

  1. Описание Языка
  2. Возможности PHP3
  3. Установка
  4. Руководство по установке PHP3 для Windows
  5. Проблемы
  6. Безопасность
  7. Конфигурация
  8. Элементы языка
  9. Выражения
  10. Математические BC (Произвольной Точности) Функции
  11. Календарные Функции
  12. Функции Даты-Времени
  13. Функции для работы с каталогами
  14. Функции динамической загрузки
  15. Функции запуска программ
  16. Функции IMAP
  17. Почтовые функции
  18. Возможности PHP3
  19. Функции SNMP
  20. Функции URL
  21. Функции переменных
  22. Функции Vmailmgr
  23. Приложения


I. Описание Языка

Глава 1. Введение в PHP3

Что такое PHP3?

PHP версии 3.0 - язык описания сценариев, выполняемых на сервере, встроенный в HTML.

Что может делать PHP3?

Возможно самая сильная и значимая возможность в PHP3 - уровень интеграции с базами данных. Написание веб-страницы работающей с базой данных невероятно проста. В настоящее временя поддерживаются следующие базы данных :
           Oracle
                                Adabas D
           Sybase
                                FilePro
           mSQL
                                Velocis
           MySQL
                                Informix
           Solid
                                dBase
           ODBC
                                Unix dbm
           PostgreSQL

Краткая История PHP

PHP был задуман где-то в конце 1994 года Расмусом Ледорфом(Rasmus Lerdorf). Ранние невыпущенные версии использовались на его домашней странице для того, чтобы следить за тем кто просматривал его интерактивное резюме. Первая используемая версия cтала доступна где-то в начале 1995 и была известна как Personal Home Page Tools. Она состояла из очень упрощенного движка синтаксического анализатора, который понимал только несколько специальных макрокоманд и ряд утилит, которые затем были в общем использовании на домашних страницах. Гостевые книги, счетчики и некоторые другие дополнения.

Довольно трудно дать какую-либо жесткую статистику, но отмечено, что к 1996 г. PHP/FI был использован по крайней мере на 15,000 веб-сайтах во всем мире. В середине 1997г. эта цифра выросла до более чем 50,000. В середине 1997г. также наблюдалось изменение в разработке PHP. Из частного любимого проекта Расмуса, которому способствовала горстка людей , это превратилось в намного более организованную рабочую группу. Синтаксический анализатор был заново переписан Зевом Сураски(Zeev Suraski) и Анди Гутмансом(Andi Gutmans), и этот новый синтаксический анализатор стал основой для PHP Версии 3.

Сегодня ( в середине -1998г.) как PHP/FI так и PHP3 поставляется с рядом коммерческих продуктов типа C2's StrongHold web server и RedHat Linux и консервативной оценкой, основанной на экстрaполяции чисел, предоставленных NetCraft было бы то, что PHP используется на 150,000 cайтах во всем мире. В перспективе, их больше чем сайтов, запущенных на Netscape's flagship Enterprise server в Интернете.


Глава 2. Возможности PHP3

      a. HTTP-аутификация средствами PHP
      b. Создание GIF-файлов с помощью PHP
      c. Поддержка file upload
      d. Поддержка HTTP cookie
      e. Поддержка баз данных
      f. Регулярные выражения
      g. Обработка ошибок
      h. PHP source viewer

HTTP-аутификация средствами PHP

HTTP аутификация в PHP доступна только при использовании модуля Apache. В модуле Apache PHP-скрипт, может использовать функцию Header() для отправки сообщения "Authentication Required" браузеру клиента, вызвав тем самым окно диалога Username/Password. Как только пользователь заполняет поля username и password, URL содержащий PHP-скрипт будет вызван заново с переменными $PHP_AUTH_USER, $PHP_AUTH_PW и $PHP_AUTH_TYPE содержащими введенную информацию. В данном случае обеспечивается только "Основная" аутификация.

Фрагмент примера сценария, который производит аутентификацию клиента на странице, должен быть следующим:

Пример 2-1. Пример HTTP аутификации

<?php
  if(!isset($PHP_AUTH_USER)) {
    Header("WWW-Authenticate: Basic realm=\"My Realm\"");
    Header("HTTP/1.0 401 Unauthorized");
    echo "Text to send if user hits Cancel button\n";
    exit;
  } else {
    echo "Hello $PHP_AUTH_USER.<P>";
    echo "You entered $PHP_AUTH_PW as your password.<P>";
  }
?>

Вместо просто распечатывания $PHP_AUTH_USER и $PHP_AUTH_PW, Вы вероятно хотели бы проверить имя_пользователя и пароль для проверки правильности. Возможно, посылая запрос к базе данных, или, ища пользователя в dbm файле.

Будьте внимательны при использовании браузера Internet Explorer. Он весьма придирчив к порядку заголовков. Отправка заголовка WWW-Authenticate перед заголовком HTTP/1.0 401 возможно даст аутификацию в любом случае.

Чтобы предотвратить от записи кем - то сценарий , который определяет пароль для страницы, которая была опознана через традиционный внешний механизм, PHP_AUTH переменные не будут установлены, если допускается внешнее установление подлинности для той специфической страницы. В этом случае может быть использована переменная $REMOTE_USER чтобы идентифицировать внешне-опознанного пользователя.

Обратите внимание, однако, что вышеупомянутое не защищает от кого - то, кто может управлять не-аутифицированным URL используя перехваченный пароль из аутифицированных URL на том же самом сервере.

И Netscape и Internet Explorer очистит локальный кэш окна аутификации после получения ответа сервера 401. Это эффективно как мера отключения пользователей("log out"), вынуждающая их повторно ввести их username и пароль. Некоторые используют это для отключения пользователя по истечении интервала времени("time out"), или обеспечивают кнопку "Log Out".

Эти методы не требуются в соответствии с Основным стандартом аутификации HTTP , так что Вы никогда не должны зависеть от этого. Тестирование с Lynx показало, что Lynx не очищает информацию аутификации с 401 ответом сервера, так что переход обратно и затем вперед снова откроет ресурс (пока требования удостоверения личности не изменились).

Также обратите внимание, что это не работает при использовании сервера Microsoft's IIS и CGI версии PHP из-за ограничений IIS.

Создание GIF-файлов с помощью PHP

PHP не ограничен созданием только HTML вывода. Он может также использоваться для создания файлов GIF, или даже более удобные потоки изображений GIF. Для этого вам надо скомпилировать PHP с библиотекой функций изображения - GD .

Пример 2-2. Создание GIF-файлов с помощью PHP

<?php
    Header("Content-type: image/gif");
    $string=implode($argv," ");
    $im = imagecreatefromgif("images/button1.gif");
    $orange = ImageColorAllocate($im, 220, 210, 60);
    $px = (imagesx($im)-7.5*strlen($string))/2;
    ImageString($im,3,$px,9,$string,$orange);
    ImageGif($im);
    ImageDestroy($im);
?>

Этот пример вызывается со страницы тегом: <img src="button.php3?text"> Вышеупомянутый скрипт button.php3 берет строку "text", накладывает сверху на основное изображение, которым в этом случае является " images/button1.gif " и выводит возникающее в результате изображение. Это - очень удобный способ не рисовать новые изображения кнопки, каждый раз, когда вы хотите изменить текст кнопки. Этим методом они будут динамически сгенерированы.

Поддержка file upload

PHP может принимать файлы, загруженные из любого браузера, отвечающего стандартам RFC-1867 (которыми являются, например, Netscape Navigator 3 или cтарше, Microsoft Internet Explorer 3 с исправлениями от Microsoft, или cтарше). Эта возможность позволяет людям загружать файлы. С PHP-аутификацией и функциями манипулирования файлами, вы имеете полный контроль над тем, кому позволять загружать файлы и что должно быть выполнено с файлом, если он был загружен.

Экран загрузки файла может быть организован созданием специальной формы, которая выглядит примерно так:

Пример 2-3. Форма загрузки файла

<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST>
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000">
Send this file: <INPUT NAME="userfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Send File">
</FORM>
_URL_ должен указать на php html файл. Cкрытое поле MAX_FILE_SIZE должно предшествовать полю ввода файла и означает максимально допустимый размер файла. Значение определяется в байтах. Для этого файла при успешной загрузке будут определены следующие переменные :
          $userfile - Временное имя файла под которым загруженный файл загружается в машину сервера.

          $userfile_name - Исходное имя файла в системе отправителя.

          $userfile_size - Размер загруженного файла в байтах.

          $userfile_type - Тип MIME файла, если броузер предоставил эту информацию.

                           Например может быть "image/gif".
Обратите внимание, что компонент вышеупомянутых переменных "$userfile" - это любое значение поля Name тега INPUT c TYPE=file обозначенное в форме загрузки. В приведенном выше примере формы загрузки мы назвали его "userfile".

По умолчанию файлы будут сохранены в заданном по умолчанию временном каталоге сервера. Его можно изменить, установкой переменной среды TMPDIR в среде, в которой PHP выполняется. Хотя, использование при ее установке обращения PutEnv () изнутри сценария PHP не будет работать.

Скрипт PHP, который получает загруженный файл, должен определить, что должно быть выполнено с загруженным файлом. Вы можете, например, использовать переменную $file_size, чтобы отбросить любые файлы, которые являются или слишком маленькими или слишком большими. Вы могли бы использовать переменную $file_type, чтобы отбросить любые файлы, которые не соответствуют некоторым критериям типа. В любом случае, вы должны или удалить файл из временного каталога или переместить эго в другое место.
Файл будет удален из временного каталога в конце запроса, если он не перемещен или переименован.

Пожалуйста обратите внимание, что вебсервер CERN httpd, кажется, удаляет все начинающееся с первого пробела в заголовке content-type mime, полученном от клиента. Пока дело обстоит так, CERN httpd не будет поддерживать возможность загрузки файла.

Поддержка HTTP cookie

PHP поддерживает HTTP cookies. Cookies - механизм для сохранения данных в удаленном браузере и, таким образом, - трэкинг или идентификация пользователей. Вы можете устанавливать файлы cookie используя функцию setcookie(). Cookies - часть HTTP заголовка, так что функция SetCookie() должна вызваться прежде чем браузеру послан какая-нибудь информация для вывода. Это - то же самое ограничение, которое касается и функции Header().

Любой cookie, посланный Вам от клиента будет автоматически превращен в переменную PHP точно так же как данные методов GET и POST. Если вы желаете назначить множественные значения одиночному cookie - просто добавьте [] к имени cookie. Для более подробной информации см. функцию setcookie ().

Поддержка баз данных

PHP поддерживает ряд различных баз данных, и в режиме работы в собственной системе команд и через ODBC, включая:

 Adabas D
                  MySQL
 dBase
                  Oracle
 Empress
                  PostgreSQL
 FilePro
                  Solid
 Informix
                  Sybase
 InterBase
                  Velocis
 mSQL
                  Unix dbm

Регулярные выражения

Регулярные выражения используются для сложного манипулирования строками в PHP. Функции, которые поддерживают регулярные выражения:
          ereg()

          ereg_replace()

          eregi()

          eregi_replace()

          split()

Все эти функции принимают строку регулярного выражения как их первый параметр. PHP использует расширенные регулярные выражения POSIX как определено в POSIX 1003.2. Для полного описания регулярных выражений POSIX см. соответствующие разделы руководства (regex), в каталоге regex дистрибутива PHP.

Example 2-4. Пример регулярных выражений

ereg("abc",$string);
/* Возвращает 'истина', если "abc"
   найдено в строке $string. */

ereg("^abc",$string);
/* Возвращает 'истина', если "abc"
   найдено в начале строки $string. */

ereg("abc$",$string);
/*  Возвращает 'истина', если "abc"
   найдено в конце строки $string. */

eregi("(ozilla.[23]|MSIE.3)",$HTTP_USER_AGENT);
/*  Возвращает 'истина', если браузер клиента
   - Netscape 2, 3 или MSIE 3. */

ereg("([[:alnum:]]+) ([[:alnum:]]+) ([[:alnum:]]+)",
     $string,$regs);
/* Помещает три слова - $regs[1], $regs[2] и $regs[3], разделенные пробелом. */

ereg_replace("^","<BR>",$string);
/* Устанавливает тег <BR> в начало строки $string. */

ereg_replace("$","<BR>",$string);
/* Устанавливает тег <BR> в конец строки $string. */

ereg_replace("\n","",$string);
/* Отсекает символ "возврат каретки" в строке $string. */

Обработка ошибок

В PHP есть 4 типа ошибок и предупреждений. Это:
          1 - Нормальные Ошибки Функции(Normal Function Errors)

          2 - Нормальные Предупреждения(Normal Warnings)

          4 - Ошибки Синтаксического Анализатора(Parser Errors)

          8 - Уведомления(Notices) : предупреждения, которые Вы можете проигнорировать но,

              которые могут подразумевать баги в вашем коде
Эти 4 типа комбинируются при определении ошибки, сообщая уровень. Ошибка по умолчанию, возвращает уровень 7, который является комбинацией 1 + 2 + 4, или все ошибки за исключением примечаний. Этот уровень может быть изменен в файле php3. ini директивой error_reporting. Он также может быть установлен в вашем файле Apache httpd.conf директивой php3_error_reporting, или же это может быть произведено во времени выполнения сценария, с использованием функции error_reporting ().

Все выражения PHP могут также вызываться с префиксом "@", который выключает сообщение об ошибке, специфичное для этого выражения. Если ошибка произошла во время выполнения такого выражения, и допускается возможность track_errors, Вы можете найти сообщения об ошибках в глобальной переменной $php_errormsg.

PHP source viewer


Глава 3. Установка

Эта глава является руководством по конфигурации и установке PHP3. Требуемые знания и программное обеспечение:

  • базовые навыки работы с UNIX (на уровне выполнения команды "make" и компилятора С);

  • компилятор ANSI C;

  • web server (очевидно);

Установка из исходных кодов на UNIX:

Загрузка исходных кодов:

Исходные коды последней версии можно найти по адресу: http://www.php.net.

Инструкции по быстрой установке (версия модуля Apache):

1.  gunzip apache_1.3.x.tar.gz
2.  tar xvf apache_1.3.x.tar
3.  gunzip php-3.0.x.tar.gz
4.  tar xvf php-3.0.x.tar
5.  cd apache_1.3.x
6.  ./configure --prefix=/www
7.  cd ../php-3.0.x
8.  ./configure --with-mysql --with-apache=../apache_1.3.x --enable-track-vars
9.  make
10. make install
11. cd ../apache_1.3.x
12. ./configure --prefix=/www --activate-module=src/modules/php3/libphp3.a
13. make
14. make install

  Вместо этих шагов Вы можете просто скопировать бинарный файл httpd поверх вашего
  существующего бинарного файла.
  Перед этим убедитесь, что Вы выключили свой сервер.

15. cd ../php-3.0.x
16. cp php3.ini-dist /usr/local/lib/php3.ini

    Вы можете отредактировать файл /usr/local/lib/php3.ini для установления опций PHP.
  Если Вы предпочитаете поместить этот файл в другое место,
  то используйте     --with-config-file=/path  в шаге 8.

17. Отредактируйте Ваш файл httpd.conf или srm.conf и добавьте:

            AddType application/x-httpd-php3 .php3

    Вы можете выбрать здесь любое расширение по Вашему желанию.
  В данном случае мы просто рекомендуем выбрать .php3.

18. Используйте Вашу обычную процедуру для запуска сервера Apache.
   (Вы должны остановить и перезапустить сервер, а не просто перезагрузить сервер
    с использованием сигнала HUP или USR1).

Конфигурация:

Имеется два пути конфигурирования PHP3.

  • используйте скрипт "setup", который поставляется с PHP3. Этот скрипт задает Вам ряд вопросов (практически совпадающих со сценарием "install" PHP/FI 2.0) и в конце запускает "configure". Для запуска этого скрипта наберите ./setup.

    Этот сценарий также создает файл, называемый "do-conf", который содержит опции, установленные при конфигурации. Вы можете редактировать этот файл для изменения некоторых опций без перезапуска "setup". Тогда выполните ./do-conf и конфигурация запустится с новыми параметрами.

  • выполните конфигурацию вручную. Для просмотра параметров Вы можете выполнить ./configure --help.

Детали различных параметров конфигурации рассмотрены ниже.

Модуль Apache:

Для построения PHP3 в качестве модуля Apache ответьте "yes" в пункте "Build as an Apache module?" (параметр конфигурации --with-apache= DIR ) и определить базовый каталог дистрибутива Apache. Если Вы распаковали свой дистрибутив Apache в директорию /usr/local/www/apache_1.2.4 то она и будет Вашей базовой директорией дистрибутива Apache. Директория по умолчанию /usr/local/etc/httpd.

Модуль fhttpd:

При построении fhttpd в качестве модуля fhttpd ответьте "yes" в пункте "Build as an fhttpd module?" (параметр конфигурации --with-fhttpd= DIR ) и определить базовый каталог исходных кодов fhttpd. По умолчанию это /usr/local/src/fhttpd. Если Вы запускаете fhttpd, то построение PHP3 в качестве модуля даст лучшую производительность и возможность контроля за удаленным исполнением.

Версия CGI:

По умолчанию PHP3 формируется как программа CGI. Если Вы используете web server с поддержкой PHP3 в качестве модуля, то в своих решениях Вы должны исходить из производительности. Однако CGI версия дает возможность пользователям Apache исполнять страницы с поддержкой PHP под различными идентификаторами пользователя. Пожалуйста, прочитайте Security chapter если Вы собираетесь исполнять PHP как CGI.

Параметры поддержки базы данных:

PHP имеет собственную поддержку для нескольких баз данных (так же как ODBC):

Adabas D

     --with-adabas =DIR

Компиляция с поддержкой Adabas D. Параметр - установочная директория Adabas D, по умолчанию /usr/local/adabasd.

Adabas home page

dBase

    --with-dbase

Включает условный атрибут поддержки Dbase. Не требует внешних библиотек.

filePro

    --with-filepro

Включает условный атрибут поддержки filePro только для чтения. Не требует внешних библиотек.

mSQL

    --with-msql=DIR

Включает поддержку mSQL. Параметр этой опции - установочная директория mSQL, по умолчанию /usr/local/Hughes. Это директория по умолчанию дистрибутива mSQL 2.0 configure автоматически определяет, какую версию mSQL Вы используете, а PHP3 поддерживает как версию 1.0, так и 2.0, но если Вы компилируете PHP2 с версией mSQL1.0, то можете получить доступ только к базам данных mSQL1.0 и наоборот.

Посмотрите также директивы mSQL Configuration в configuration file.

mSQL home page

MySQL

    --with-mysql=DIR

Включает поддержку MySQL. Параметр в этой опции - установочная директория MySQL, по умолчанию /usr/local. Она является директорией по умолчанию в дистрибутиве MySQL.

Посмотрите также директивы MySQL Configuration в configuration file.

MySQL home page

iODBC

    --with-iodbc=DIR

Включает поддержку iODBC. Этот признак был разработан сначала для iODBC Driver Manager, перераспределяемого ODBC driver manager, который выполняется под множеством разновидностей UNIX. Параметром этой опции является установочная директория iODBC, по умолчанию /usr/local.

FreeODBC home page

OpenLink ODBC

    --with-openlink=DIR

Включает поддержку OpenLink ODBC. Параметром этой опции является установочная директория OpenLink ODBC, по умолчанию /usr/local/openlink.

OpenLink Software's home page

Oracle

    --with-oracle=DIR

Включает поддержку Oracle. Протестирован и должен работать на версиях Oracle от 7.0 до 7.3. Параметром является директория ORACLE_HOME Вы не должны определять этот параметр, если была установлена среда окружения Oracle.

Oracle home page

PostgreSQL

    --with-pgsql=DIR

Включает поддержку PostgreSQL. Параметром является базовая установочная директория PostgreSQL, по умолчанию /usr/local/pgsql.

Посмотрите также директивы Postgres Configuration в configuration file.

PostgreSQL home page

Solid

    --with-solid=DIR

Включает поддержку Solid. Параметром является установочная директория Solid, по умолчанию /usr/local/solid.

Solid home page

Sybase

    --with-sybase=DIR

Включает поддержку Sybase. Параметром является установочная директория Sybase, по умолчанию /home/sybase.

Посмотрите также директивы Sybase Configuration в configuration file.

Sybase home page

Sybase-CT

    --with-sybase-ct=DIR

Включает поддержку Sybase-CT. Параметром является установочная директория Sybase, по умолчанию /home/sybase.

Посмотрите также директивы Sybase-CT Configuration в configuration file.

Velocis

    --with-velocis=DIR

Включает поддержку Velocis. Параметром этой опции является установочная директория OpenLink ODBC, по умолчанию /usr/local/velocis.

Velocis home page

A custom ODBC library

    --with-custom-odbc=DIR

Включает поддержку для произвольной custom ODBC library. Параметром является базовая директория, по умолчанию /usr/local.

Эта опция подразумевает, что Вы определили CUSTOM_ODBC_LIBS, когда исполняется сценарий конфигурации. Вы также должны иметь правильный заголовочный файл odbc.h где-нибудь в путях включения. Если у Вас его нет, то создайте свой заголовочный файл и включите его отсюда. Он может также требовать несколько внешних определений, особенно когда это на нескольких платформах. Определите их в CFLAGS.

Например Вы можете использовать Sybase SQL Anywhere on QNX следующим образом: CFLAGS=-DODBC_QNX LDFLAGS=-lunix CUSTOM_ODBC_LIBS="-ldblib -lodbc" ./configure --with-custom-odbc=/usr/lib/sqlany50

Unified ODBC

    --disable-unified-odbc

Отключает Unified ODBC модуль, который является общим интерфейсом ко всем базам данных с интерфейсом, основанным на ODBC, таких как Solid и Adabas D. Это также работает для нормальных библиотек ODBC. Был проверен с iODBC, Solid, Adabas D и Sybase SQL Anywhere. Требуется, чтобы один (и только один) из этих модулей или модуль Velocis был включен или определена пользовательская библиотека ODBC. Этот параметр применим только если используется одна из следующих опций: --with-iodbc, --with-solid, --with-adabas, --with-velocis, или --with-custom-odbc,

Посмотрите также директивы Unified ODBC Configuration в configuration file.

LDAP

    --with-ldap=DIR

Включает поддержку LDAP (Lightweight Directory Access Protocol). ). Параметром является базовая установочная директория LDAP, по умолчанию /usr/local/ldap.

Более подробную информацию по LDAP можно найти в RFC1777 и RFC1778.

Другие параметры конфигурации:

--enable-sysvsem

    --enable-sysvsem

Включает поддержку для семафоров Sys V (поддерживается большинством разновидностей UNIX). Для получения подробной информации смотрим Semaphore and Shared Memory documentation.

--enable-sysvshm

    --enable-sysvshm

Включает поддержку разделяемой памяти для Sys V (поддерживается большинством разновидностей UNIX). Для получения подробной информации смотрим Semaphore and Shared Memory documentation.

--with-xml

    --with-xml

Включает поддержку для непроверенных синтаксических анализаторов XML, используя библиотеку от James Clark's expat library. Для больших подробностей обратитесь к XML function reference.

--enable-maintainer-mode

    --enable-maintainer-mode

Включает дополнительные зависимости и предупреждения компилятора, используемые некоторыми разработчиками PHP3.

--with-system-regex

    --with-system-regex

Использует библиотеку регулярных выражений прежде, чем собственные условия. Если Вы построили PHP3 в качестве модуля сервера, Вы должны использовать одинаковую библиотеку - и когда собираете PHP3 и когда собираете сервер. Включите эту опцию, если системные библиотеки обеспечивают специальные свойства, которые Вам требуются. Рекомендуется при возможности использовать собственные библиотеки.

--with-config-file-path

    --with-config-file-path=DIR

Маршрут, используемый для просмотра the php3.ini file при старте PHP.

--with-exec-dir

    --with-exec-dir=DIR

Разрешить только запуск исполнимых файлов в DIR при нахождении в защищенном режиме. По умолчанию это /usr/local/bin. Эта опция только устанавливает значение по умолчанию, которое потом можно изменить при помощи директивы safe_mode_exec_dir в configuration file.

--disable-debug

    --disable-debug

Не включает информацию об отладке в библиотеке или исполнимой программе. Отладочная информация просто точно указывает на ошибки, поэтому можно выключить отладку, пока PHP3 находится в стадии бета или альфа версий.

--enable-safe-mode

    --enable-safe-mode

Включает защищенный режим (safe mode) по умолчанию. Это накладывает некоторые ограничения на действия PHP, таких как открытие файлов только внутри корня документа. Для более подробной информации смотрите Security chapter Пользователи CGI всегда должны включать безопасный режим. Эта опция только устанавливает значение по умолчанию, которое потом можно включить или выключить при помощи директивы safe_mode configuration file.

--enable-track-vars

    --enable-track-vars

Указывает PHP3 отслеживать пришедшие переменные GET/POST/cookie в массивах HTTP_GET_VARS, HTTP_POST_VARS и HTTP_COOKIE_VARS. Эта опция только устанавливает значение по умолчанию, которое потом можно включить или выключить при помощи директивы track_vars в configuration file.

--enable-magic-quotes

    --enable-magic-quotes

Включает по умолчанию системные квоты. Эта опция только устанавливает значение по умолчанию, которое потом можно включить или выключить при помощи директивы magic_quotes_runtime в configuration file. Смотрим также директивы magic_quotes_gpc и magic_quotes_sybase.

--enable-debugger

    --enable-debugger

Включает внутреннюю поддержку PHP3 debugger. Это свойство находится в стадии испытания. Смотрим также директивы Debugger Configuration в configuration file.

--enable-discard-path

    --enable-discard-path

Если это включено, то бинарный PHP CGI может быть безопасно помещен вне дерева web и пользователи не смогут обойти защиту .htaccess. Читайте об этой опции section in the security chapter.

--enable-bcmath

    --enable-bcmath

Включает стиль bc произвольной точности математических функций. Смотрим также опцию bcmath.scale в configuration file.

--enable-force-cgi-redirect

    --enable-force-cgi-redirect

Включает проверку безопасности для внутренних переадресаций сервера (redirect). Вы должны использовать это, если запускаете CGI версию с Apache.

Когда PHP используется в качестве исполняемого CGI, PHP по умолчанию сначала всегда проверяет, что используется переадресацией (например под Apache, используя директивы Action). Это дает уверенность, что исполняемый PHP не может использоваться для того, чтобы обойти стандартные процедуры установления прав web сервера путем непосредственного вызова, как например http://my.host/cgi-bin/php/secret/doc.html. Этот пример, доступен на http://my.host/secret/doc.html но игнорирует все установленные httpd правила безопасности для директории /secret.

Не установленная опция отключает проверку и дает возможность обхода защиты httpd и настроек предъявления полномочий. Делайте это только тогда, когда программное обеспечение Вашего сервера неспособно указать, что была выполнена безопасная переадресация и все Ваши файлы в корне документа, а также директории пользователей общедоступны.

Читайте об этой опции в section in the security chapter.

--disable-short-tags

    --disable-short-tags

Отключает краткую форму <? ?>тегов PHP3. Вы должны отключить краткую форму, если хотите использовать PHP3 c XML. При отключенной краткой форме принимается только тег PHP3 <?php ?>. Эта опция только устанавливает значение по умолчанию, которое потом можно включить или выключить при помощи директивы short_open_tag в configuration file.

--enable-url-includes

    --enable-url-includes

Дает возможность выполнять код на других HTTP и FTP серверах непосредственно из PHP3 с include(). Смотрим также опцию include_path в configuration file.

--disable-syntax-hl

    --disable-syntax-hl

Выключает синтаксическое выделение.

CPPFLAGS и LDFLAGS

При сборке PHP3 установщик просматривает заголовочные и библиотечные файлы в различных директориях, измените соответственно переменные окружения CPPFLAGS и LDFLAGS. Если Вы используете нормальный shell, то вы должны написать LDFLAGS=-L/my/lib/dir CPPFLAGS=-I/my/include/dir ./configure

Построение:

Когда PHP3 сконфигурирован, Вы готовы к построению исполнимых CGI или библиотеку PHP3. Об этом заботится команда make. Если Вы потерпели неудачу и не можете понять почему, то смотрите раздел Problems section.

VPATH

Проверка:

Если Вы собрали PHP3 в качестве программы CGI, Вы можете проверить результат, выполнив команду make test. Это хорошая идея - проверить результат сборки. Этим способом Вы можете обнаружить проблему с Вашим PHP3 на ранней стадии, вместо того, чтобы бороться с этим позже.

Контрольное тестирование:

Если Вы собрали PHP3 в качестве программы CGI, Вы можете протестировать свою версию при помощи команды make bench. Обратите внимание, что если используется защищенный режим по умолчанию, то тест может не завершиться, если он требует больше, чем 30 секунд. Это происходит потому, что set_time_limit() () не может быть использована в защищенном режиме. Используйте max_execution_time для контроля этого времени в Ваших собственных сценариях. make bench игнорирует configuration file.


Руководство по установке PHP3 для Windows

Это руководство по установке поможет Вам установить и сконфигурировать PHP3 на Ваших web серверах под Windows 9x/NT. Данное руководство составил Bob Silva. Последнюю версию можно найти по адресу http://www.umesd.k12.or.us/php/win32install.html.

Данное руководство обеспечивает поддержку установки на:

Personal Web Server (рекомендуется новейшая версия)
Internet Information Server 3 or 4
Apache 1.3.x
Omni HTTPd 2.0b1

Изменение конфигурации для PHP3:

Все модули теперь начинаются с префикса 'php3_'. Вы должны изменить свой файл php3.ini и/или все сценарии загрузки расширений с функцией dl() (либо везде удалите префикс 'php3_'). Это предотвратит путаницу между модулями PHP и их библиотеками обеспечения.

ChangeLog, FAQ и обновленную документацию всегда можно найти на официальном сайте PHP или любом из его зеркал.

Основные шаги установки:

Данные шаги должны быть выполнены при любой установке перед специфическими инструкциями сервера:

  • Распакуйте дистрибутивный файл в директорию по Вашему выбору. Неплохим вариантом будет "C:\PHP3\".

  • Скопируйте файл 'php3-dist.ini' в Вашу директорию '%WINDOWS%' и переименуйте его в 'php3.ini'. Ваша директория '%WINDOWS%' обычно:

    c:\windows for Windows 95/98
    c:\winnt or c:\winnt40 for NT servers

  • Отредактируйте Ваш файл 'php3.ini':

    • вам потребуется изменить 'extension_dir' на путь к Вашей установочной директории PHP, либо куда Вы поместили файлы 'php3_*.dll' (например c:\php3);

    • установите 'doc_root' в путь, где располагается document_root web сервера (например c:\apache\htdocs или c:\webroot);

    • выберите, какие модули Вы желаете загружать при старте PHP. Вы можете раскомментировать линии 'extension=php3_*.dll' для загрузки соответствующих модулей. Некоторые модули требуют дополнительной установки некоторых библиотек в систему для корректной работы. В FAQ PHP можно получить больше информации о том, где получить библиотеки поддержки. Вы можете также загружать модули динамически, используя в сценарии dl("php_*.dll");

    • на PWS и IIS Вы можете установить browscap.ini в директории 'c:\windows\system\inetsrv\browscap.ini' для Windows 95/98 и 'c:\winnt\system32\inetsrv\browscap.ini' для Windows NT. Дополнительную информацию по использованию browscap в PHP можно на зеркале mirror, выберите кнопку "source", чтобы увидеть это в действии;

Windows 95/98/NT и PWS/IIS 3:

Рекомендуемый метод конфигурирования этих серверов состоит в использовании INF файлов, поставляемых с дистрибутивом (php_iis_reg.inf). Вы можете отредактировать этот файл и убедитесь, что расширения и установочная директория PHP соответствует Вашим параметрам. Или Вы можете следовать перечисленным ниже шагам, чтобы сделать это вручную.

ПРЕДУПРЕЖДЕНИЕ: Эти шаги включают в себя непосредственную работу с windows registry. Мы настоятельно рекомендуем вам сначала сделать резервную копию registry. Группа разработчиков PHP не несет ответственности, если Вы повредите Ваш registry.

  • Запустите Regedit;

  • Перейдите к: HKEY_LOCAL_MACHINE /System/CurrentControlSet /Services /W3Svc /Parameters/ScriptMap.

  • В меню редактирования выберите New->String Value.

  • Определите расширение, которое Вы хотите использовать для ваших сценариев PHP (например .php3).

  • Дважды щелкните на значении новой строки и введите путь к php.exe exe в поле данных (например c:\php3\php.exe %s %s). '%s %s' ОЧЕНЬ важны, PHP не будет работать без этого должным образом;

  • Повторите эти шаги для каждого расширения, которое Вы хотите ассоциировать со сценариями PHP;

  • Теперь перейдите к HKEY_CLASSES_ROOT;

  • В меню редактирования выберите New->Key;

  • Определите ключ к расширению, которое Вы установили в предыдущем разделе (например .php3

  • Выделите новый ключ, в правой части окна дважды щелкните "default value" и введите phpfile.

  • Повторите последний шаг для каждого расширения, которое Вы установили в предыдущей секции;

  • Теперь создайте другой New->Key под HKEY_CLASSES_ROOT и это имя phpfile.

  • Выделите новый ключ phpfile phpfile и в правой части окна, дважды щелкните "default value" и введите PHP Script.

  • Щелкните правой клавишей на phpfile и выберите New->Key, это имя Shell.

  • Щелкните правой клавишей на Shell и выберите New->Key, это имя open.

  • Щелкните правой клавишей на open и выберите New->Key, это имя command.

  • Выделите новый ключ command и в правой части окна дважды щелкните на "default value" и введите путь к php.exe. Например: c:\php3\php.exe -q %1. (не забудьте %1).

  • Выйдите из Regedit;

Пользователи PWS и IIS 3 теперь имеют полностью работающую систему. Пользователи IIS 3 могут использовать tool от Steven Genusa для конфигурирования своих карт сценариев.

Windows NT и IIS 4

Для установки PHP3 на NT Server с запущенным IIS4 следуйте следующим инструкциям:

  • В Internet Service Manager (MMC) выберите Web site или отправной каталог приложения;

  • Откройте меню свойства каталога (щелкните правой клавишей мыши и выберите свойства) и тогда щелкните Home Directory, Virtual Directory или Directory tab;

  • Щелкните кнопку Configuration и тогда выберите App Mappings tab;

  • Щелкните Add, в рамке Executable наберите c:\path-to-php-dir\php.exe %s %s. Вы ДОЛЖНЫ подставить в конце %s %s , PHP не будет функционировать правильно, если Вы этого не сделаете;

  • В рамке Extension определите расширение файла, которое Вы желаете ассоциировать со сценариями PHP (обычно (.php3 и .phtml);

  • Установите требуемую безопасность (это делается в Internet Service Manager) и, если Ваш NT Server использует файловую систему NTFS, добавьте права на исполнение для директории I_USR_, которая содержит php.exe.

Windows 9x/NT и Apache 1.3.x

Вы должны редактировать Ваш файл srm.conf или httpd.conf , чтобы сконфигурировать Apache для работы с исполняемыми PHP CGI.

Хотя может быть несколько вариантов конфигурирования PHP под Apache, это делается достаточно просто даже для новичка. Пожалуйста, обратитесь к документации по Apache для получения информации о директивах конфигурации.

  • ScriptAlias /php3/"c:/path-to-php-dir/php.exe"

  • AddType application/x-httpd-php3 .php3

  • AddType application/x-httpd-php3 .phtml

  • Action application/x-httpd-php3 "php3/php.exe"

Для обеспечения возможности использования исходного текста, просто создайте файл сценария PHP и вставьте этот код в: . Substitute original_php_script.php3php3 с именем желательного файла источника (это только один из путей). Обратите внимание, что на Win-Apache все обратные слеши в пути предложения, такого как "c:\directory\file.ext" должны быть заменены на прямые.

Omni HTTPd 2.0b1 для Windows

Данная конфигурация должно быть самая простая:

Шаг 1: Установите Omni server;
Щелкните правой клавишей на голубой иконке OmniHTTPd в system tray и выберите Properties
Шаг 3: Щелкните на Web Server Global Settings
Шаг 4: На 'External' tab введите: virtual = .php3 | actual = c:\path-to-php-dir\php.exe
Шаг 5: На Mime tab, введите: virtual = wwwserver/stdcgi | actual = .php3
Шаг 6: Щелкните OK

Повторите шаги 2 - 6 для каждого расширения, которое Вы желаете ассоциировать с PHP.

Модули PHP:

Таблица 3-1. Модули PHP

php3_calendar.dll | Функции преобразования календаря
php3_crypt.dll | Функции шифрования
php3_dbase.dll | Функции баз данных
php3_dbm.dll | Эмуляция GDBM посредством Berkely DB2 library
php3_filepro.dll | Доступ READ ONLY к базам данных filepro
php3_gd.dll | Библиотека функций GD для манипуляций с gif
php3_hyperwave.dll | Функции HyperWave
php3_imap4r2.dll | Функции IMAP 4
php3_ldap.dll | Функции LDAP
php3_msql1.dll | Клиент mSQL 1
php3_msql2.dll | Клиент mSQL 2
php3_mssql.dll | Клиент MSSQL (требует MSSQL DB-Libraries)
php3_mysql.dll | Функции MySQL
php3_nsmail.dll | Функции Netscape mail
php3_oci73.dll | Функции Oracle
php3_snmp.dll | Функции SNMP (только для NT!)
php3_zlib.dll | Функции ZLib


Проблемы?

Читайте FAQ:

Некоторые проблемы встречаются чаще других. Наиболее распространенные описаны в PHP3 FAQ, который можно найти по адресу: http://www.php.net/FAQ.php3

Сообщения об ошибках:

Если Вы считаете, что нашли ошибку в PHP3, то сообщите о ней. Разработчики PHP3 вероятно не знают об этом и если Вы о ней не сообщите, то она так и не будет исправлена. Формы для сообщений об ошибках доступны на сети сайтов PHP3, главная форма находится по адресу: http://ca.php.net/bugs.php3.

Другие проблемы:

Если Вы все еще не можете решить проблему, то возможно кто-нибудь из списка рассылки PHP3 способен Вам помочь. Вы прежде всего должны проверить архив на тот случай, если кто-нибудь уже ответил людям с подобными проблемами. Архив можно найти по адресу http://www.tryc.on.ca/php3.html. Для того, чтобы подписаться на список рассылки PHP3 пошлите пустое письмо по адресу php3-subscribe@lists.php.net. Адрес списка рассылки php3@lists.php.net.

Если Вы хотите получить помощь через список рассылки, пожалуйста, попробуйте быть точным и дать необходимые детали о Вашем окружении (операционная система, версия PHP, какой используется web server, запускаете Вы PHP как CGI или в качестве модуля и т.д.) и желательно было бы предоставить код, чтобы другие могли воспроизвести и протестировать Вашу проблему.


Безопасность:

PHP является мощным инструментом. Как и в случае с другими мощными средствами, Вы можете навредить сами себе. PHP функционирует таким образом, что если его небрежно использовать, то могут возникнуть проблемы с безопасностью на Вашей системе. Лучший путь для предотвращения такой ситуации - всегда знать, что Вы делаете. Для получения более подробной информации читайте Security chapter.


Глава 4. Конфигурация

Файл php3.ini

Файл php3.ini читается при запуске синтаксического анализатора PHP. Для версий серверного модуля PHP, это случается только один раз, когда запускается веб-сервер. Для версии CGI это случается на каждом вызове.

Только для каждой директивы указанной здесь, имеется соответствующая директива Apache в httpd.conf. Просто добавьте php3_ в начале имен директив, указанных здесь.

Вы можете посмотреть установочные параметры большинства значений конфигурации вызвав функцию phpinfo().

Основные директивы конфигурации

auto_append_file string

Определяет имя файла, который автоматически проверяется после основного файла. Файл включается так же, как если бы была вызвана функция include(), с использованием include_path.

Специальное значение none запрещает авто-добавление.

Примечание: Если сценарий обрывается функцией exit(), авто-добавление не произойдет.

auto_prepend_file string

Определяет имя файла, который автоматически проверяется перед основным файлом. Файл включается так же, как если бы была вызвана функция include(), с использованием include_path.

Специальное значение none запрещает авто-добавление.

cgi_ext string
display_errors boolean

Это определяет, должны ли ошибки печататься на экране как часть HTML вывода или нет.

doc_root string

Главный каталог("root directory") PHP на сервере. Используется только когда он не пустой. Если PHP сконфигурирован при помощи safe mode, то никакие другие файлы за пределами этого каталога не обслуживаются.

engine boolean

Эта директива действительно полезна только в модуле PHP под Apache. Это используется на сайтах, где необходимо включать и выключать синтаксический анализ PHP на определенные каталоги и виртуальные серверы. Установкой php3_engine off в допустимом месте файла httpd.conf, PHP можно запрещать и разрешать.

error_log string

Имя файла, куда сохраняется журнал ошибок(log file) сценариев. Если используется специальное значение syslog, ошибки отправляются в системный журнал(system logger). В UNIX'е это syslog(3), а в Windows NT это журнал событий (event log). Системный журнал не поддерживается в Windows 95.

error_reporting integer

Устанавливает уровень сообщений об ошибках. Параметр является целым, представляющим битовую область. Добавьте те значения уровней сообщений об ошибках, которые Вы хотите.

Таблица 4-1. Уровни сообщений об ошибках

bit value

допустимые сообщения

1 | нормальные ошибки
2 | нормальные предупреждения
4 | ошибки синтаксического анализатора
8 | некритичные предупреждения стиля
Значение по умолчанию - 7 (показываются нормальные ошибки, нормальные предупреждения и синтаксические ошибки).

open_basedir string

Ограничивает файлы, которые могут открываться PHP в определенном директории-дереве.

Когда сценарий пытается открыть файл с помощью, например, fopen или gzopen, наличие/расположение файла проверяется. Когда файл находится за пределами определенного директория-дерева, PHP откажется открыть его. Все символьные ссылки определены, так что нет возможности избежать этого ограничения с помощью symlink.

Специальное значение . показывает что каталог, в котором находится сценарий, используется как основной каталог.

По умолчанию допускается открытие всех файлов.

gpc_order string

Устанавливает допустимость GET/POST/COOKIE в анализе. Установка по умолчанию этой директивы - "GPC". Установка ее в "GP", например, вынудит PHP полностью игнорировать cookies и перезапишет любые переменные метода GET переменными метода POST с одинаковыми именами.

include_path string

Определяет список каталогов где будут располагаться файлы для функций require(), include() и fopen_with_path() . Формат подобен формату системной переменной окружения PATH : список каталогов разделяется двоеточием в UNIX или точкой с запятой в Windows.

Пример 4-1. UNIX include_path

include_path=.:/home/httpd/php-lib

Пример 4-2. Windows include_path

include_path=".;c:\www\phplib"
Значением по умолчанию этой директивы является. (только текущий каталог).

isapi_ext string

log_errors boolean

Сообщает, что независимые сообщения об ошибке сценария должны регистрироваться в журнале ошибок сервера. Этот выбор таким образом является специфичным для сервера.

magic_quotes_gpc boolean

Устанавливает magic_quotes состояние для GPC (Get/Post/Cookie) операций. Когда magic_quotes включено (on), все ' (одиночные кавычки), " (двойные кавычки), \ (обратные слэши) и нулевые значения (NUL's) записываются с обратной косой чертой автоматически. Если также включено magic_quotes_sybase, одиночная кавычка записывается с дополнительной одиночной кавычкой вместо обратной косой черты.

magic_quotes_runtime boolean

Если magic_quotes_runtime разрешено, большинство функций, которые возвращают данные из любого внешнего источника разной природы, включая базы данных и текстовые файлы, будут иметь кавычки, записанные с обратной косой чертой. Если magic_quotes_sybase также включены, одиночная кавычка записывается с дополнительной одиночной кавычкой вместо обратной косой черты.

magic_quotes_sybase boolean

Если magic_quotes_sybase также разрешено, одиночная кавычка записывается с дополнительной одиночной кавычкой вместо обратной косой черты, если magic_quotes_gpc или magic_quotes_runtime разрешены.

max_execution_time integer

Эта установка определяет максимальное время в секундах допустимое для сценария, прежде чем он будет прекращен анализатором. Это помогает предохраниться от плохо/некорректно написанных сценариев.

memory_limit integer

Эта установка определяет максимальный размер памяти в байтах, допустимый для этого сценария. Это помогает запретить плохо/некорректно написанным сценариям использовать всю доступную память на сервере.

nsapi_ext string

short_open_tag boolean

Задает допустимость короткой формы (<? ?> тегов PHP . Если вы хотите использовать PHP совместно с XML, эту опцию необходимо отключить. Если опция отключена, вы должны использовать длинную форму тегов (<?php ?>).

sql.safe_mode boolean

track_errors boolean

Если опция разрешена, последнее сообщение об ошибке всегда будет представлена в глобальной переменной $php_errormsg.

track_vars boolean

Если опция разрешена, входящая информация GET, POST и cookie может быть найдена в глобальных ассоциативных массивах $HTTP_GET_VARS, $HTTP_POST_VARS и $HTTP_COOKIE_VARS, соответственно.

upload_tmp_dir string

Временный каталог, используемый для хранения файлов при их загрузке на сервер. Должен допускать запись, независимо от того, каким пользователем PHP используется.

user_dir string

Основное имя каталога, используемого в домашнем каталоге пользователей для файлов PHP, например public_html.

warn_plus_overloading boolean

Если разрешено, эта опция выдает при выводе PHP сообщение когда оператор плюс(+) используется в строке. Это должно облегчить поиск сценариев, которые должны быть перезаписаны с заменой на (.) - string concatenator.

Директивы Конфигурации Почты

SMTP string

Имя DNS или IP адрес сервера SMTP, который должен использоваться PHP под Windows для отправки сообщения функцией mail().

sendmail_from string

Определяет "From:" - почтовый адрес, который используется в сообщении, отправленном PHP под Windows.

sendmail_path string

Указывает где может быть найдена программа sendmail, обычно это /usr/sbin/sendmail или /usr/lib/sendmail
configure делает честную попытку определить это за вас и устанавливает значение по умолчанию, но в случае неудачи вы можете установить это здесь.

Системы не использующие sendmail должны установить оболочку/замену sendmail их предлагаемой системой почты, если имеется. Например, Qmail пользователи могут указать /var/qmail/bin/sendmail.

Директивы Конфигурации Safe Mode

safe_mode boolean

Устанавливает допустимость PHP safe mode. Читайте главу Безопасность (Security) для большей информации

safe_mode_exec_dir string

Если PHP используется в safe mode, system() и другие функции, выполняющие системные программы, отказываются запускать программы, которые находятся не в этом каталоге.

Debugger Configuration Directives

debugger.host string

DNS-имя или IP-адрес хоста используемого отладчиком.

debugger.port string

Номер порта используемого отладчиком.

debugger.enabled boolean

Задает допустимость использования отладчика.

Директивы Загрузки Расширений(Extension Loading)

enable_dl boolean

Эта директива действительно полезна только в модуле PHP под Apache. Вы можете разрешать/запрещать динамическую загрузку расширений PHP функцией dl() раздельно по каталогам и/или по виртуальным серверам.

Основная причина для выключения динамической загрузки - безопасность. С динамической загрузкой, можно игнорировать все ограничения safe_mode и open_basedir.

По умолчанию динамическая загрузка должна допускаться, за исключением случаев, когда используется safe-mode. В safe-mode всегда недопустимо использование dl().

extension_dir string

В каком каталоге PHP должен искать динамически загружаемые расширения.

extension string

Какие динамически загружаемые расширения загрузить, при запуске PHP.

Директивы конфигурации MySQL

mysql.allow_persistent boolean

Допустить постоянные/устойчивые MySQL соединения.

mysql.max_persistent integer

Максимальное число постоянных MySQL соединений за один процесс.

mysql.max_links integer

Максимальное число MySQL соединений за процесс, включая постоянные соединения.

Директивы конфигурации mSQL

msql.allow_persistent boolean

Допустить постоянные mSQL соединения.

msql.max_persistent integer

The maximum number of persistent mSQL connections per process.

msql.max_links integer

Максимальное число постоянных mSQL соединений за один процесс.

Директивы конфигурации Postgres

pgsql.allow_persistent boolean

Допустить постоянные/устойчивые соединения Postgres.

pgsql.max_persistent integer

Максимальное число постоянных соединений Postgres за процесс.

pgsql.max_links integer

Максимальное число Postgres соединений за процесс, включая постоянные соединения.

Директивы Конфигурации Sybase

sybase.allow_persistent boolean

Допустить постоянные Sybase соединения.

sybase.max_persistent integer

Максимальное число постоянных Sybase соединений за процесс.

sybase.max_links integer

Максимальное число Sybase соединений за процесс, включая постоянные соединения.

Директивы Конфигурации Sybase-CT

sybct.allow_persistent boolean

Допустить постоянные Sybase-CT соединения. По умолчанию включено.

sybct.max_persistent integer

Максимальное число постоянных Sybase-CT соединений за процесс. По умолчанию значение -1 означающее неограниченное количество.

sybct.max_links integer

Максимальное число Sybase-CT соединений за процесс, включая постоянные соединения. По умолчанию значение -1 означающее неограниченное количество.

sybct.min_server_severity integer

Сообщения Сервера со степенью более чем или равной sybct.min_server_severity будут сообщены как предупреждения. Эта величина может также устанавливаться из сценария вызовом sybase_min_server_severity(). Значение по умолчанию - 10 , которое сообщает ошибки строгости информации, или выше.

sybct.min_client_severity integer

Сообщения библиотеки Клиента со строгостью более чем или равной sybct.min_client_severity будут сообщены как предупреждениях. Эта величина может также устанавливаться из сценария вызовом sybase_min_client_severity(). По умолчанию - 10, что эффективно запрещает вывод.

sybct.login_timeout integer

Максимальное время (в секундах) ожидания повторной попытки соединения, прежде чем будет отказ. Имейте в виду, что если max_execution_time превышен когда время попытки соединения закончится, ваш сценарий будет расторгнут прежде, чем будут предприняты какие-либо действия на случай отказа. По умолчанию - одна минута.

sybct.timeout integer

Максимальное время(в секундах)ожидания окончания select_db или выполнения запроса. Имейте в виду, что если max_execution_time превышен, когда время функционирования истекает, ваш сценарий будет расторгнут прежде, чем будут предприняты какие-либо действия на случай отказа. По умолчанию не ограничено.

sybct.hostname string

Имя хоста, с которым вы хотите соединиться, для показа sp_who. По умолчанию - none.

Директивы Конфигурации BC Math

bcmath.scale integer

Количество десятичных цифр для всех функций bcmath.

Директивы Конфигурации Возможностей Броузера

browscap string

имя файла возможностей браузера.

Директивы Конфигурации Унифицированных ODBC

uodbc.default_db string

ИСТОЧНИК ДАННЫХ ODBC, для использования, если ничего не определено в odbc_connect() или odbc_pconnect().

uodbc.default_user string

Имя пользователя, используемое если нет определений в odbc_connect() или odbc_pconnect().

uodbc.default_pw string

Пароль, используемый, если не определено в odbc_connect() или odbc_pconnect().

uodbc.allow_persistent boolean

Допустить постоянные/устойчивые ODBC соединения.

uodbc.max_persistent integer

Максимальное число постоянных ODBC соединений за процесс.

uodbc.max_links integer

Максимальное число ODBC соединений за процесс, включая постоянные соединения.

Модуль Apache

Директивы конфигурации модуля Apache

Модуль CGI переадресации module/action

CGI

Виртуальные хосты

Безопасность

PHP - мощный язык и интерпретатор, независимо от того, включен ли он в веб-сервер как модуль или выполняется как разделение исполнимых файлов(binary) CGI, он может иметь доступ к файлам, выполнять команды и открывать сетевые соединения на сервере. Эти свойства дают возможность выполнять что-нибудь на веб-сервере небезопасное по умолчанию.

PHP разработан специально для того чтобы быть более безопасным языком для написания программ CGI, чем Perl или C.
С правильным выбором compile-time и runtime опций конфигурации он дает вам как раз ту комбинацию свободы и безопасности, которая вам нужна.

Как есть много разных путей использования PHP, есть и большой выбор конфигураций, управляющих поведением PHP. Большой выбор опций гарантирует, что вы можете использовать PHP для многих целей, но это также означает что есть комбинации этих опций и, также, конфигураций сервера, которые заканчиваются небезопасной установкой. Эта глава объясняет различные комбинации опций конфигурации и ситуации, в которых они могут быть удачно использованы.

CGI binary

Возможные атаки

Использование PHP как исполнимых файлов CGI - выбор для установок, которые по некоторой причине не хотят внедрить PHP как модуль в программное обеспечение сервера (подобно Apache), или PHP будет использоваться с другими типами оболочек CGI, чтобы создать надежное окружение chroot и setuid для сценариев. Эта установка обычно включает установку выполняемого(binary) PHP в каталог cgi-bin на веб-сервере. Бюллетень CERT CA-96.11 рекомендует кроме того, устанавливать любые интерпретаторы в cgi-bin. Даже если исполнимый PHP может быть использован в качестве автономного интерпретатора, PHP разработан для того чтобы предохранить от атаки, которую эта установка делает возможной:

  • Доступ к системным файлам: http://my.host/cgi-bin/php?/etc/passwd

    Информация запроса в url после знака вопроса (?) проходит как аргументы командной строки интерпретатору через интерфейс CGI. Обычно переводчики открывают и выполняют файл указанный как первый аргумент в командной строке.

    Вызванный как исполняемый CGI-файл, PHP отказывается интерпретировать командные аргументы строки.

  • Доступ к любым веб-документам на сервере: http://my.host/cgi-bin/php/secret/doc.html

    Часть URL с информацией о пути, стоящая после имени PHP-файла, /secret/doc.html обычно используется, чтобы определить имя файла, который должен открываться и интерпретироваться CGI программой. Обычно некоторые директивы конфигурации веб-сервера(Apache: Action) используются, чтобы перенаправить запросы к документам подобно http://my.host/secret/script.php3 на PHP интерпретатор. С такой установкой веб-сервер сначала проверяет разрешения доступа в каталоге /secret, и потом создает запрос перенаправления http://my.host/cgi-bin/php/secret/script.php3.

    К несчастью, если запрос не дается изначально в этой форме, веб-сервер не проверяет доступ к файлу /secret/script.php3, но только для файла /cgi-bin/php. Таким образом любой пользователь, имеющий доступ к /cgi-bin/php, получает доступ к любым защищенным документам на сервере.

    В PHP, опция compile-time конфигурации --enable-force-cgi-redirect и директивы runtime-конфигурации doc_root и user_dir может использоваться для того чтобы отразить эту атаку, если дерево документов сервера имеет любые директории с ограничениями доступа. Смотрите ниже для полного объяснения других комбинаций.

Вариант 1: обслуживаются только общие(public) файлы

Если ваш сервер не имеет какой-либо информации, которая не ограничивается паролем или управлением доступом на основе ip, нет потребности в этих опциях конфигурации. Если ваш веб-сервер не позволяет вам производить перенаправление, или сервер не имеет пути, чтобы связаться с исполнимым PHP, который запрашивает благополучно перенаправленный запрос, вы можете указать опцию --disable-force-cgi-redirect для конфигурирования сценария.
Вы все еще должны убедиться, что ваши сценарии PHP не полагаются на этот или другой путь вызова сценария, ни непосредственно http://my.host/cgi-bin/php/dir/script.php3, ни переадресацией http://my.host/dir/script.php3.

Перенаправление может быть сконфигурировано, например в Apache, директивами AddHandler и Action (см. ниже).

Вариант 2: использование --enable-force-cgi-redirect

Эта compile-time опция предохраняет от вызова PHP напрямую с URL подобно http://my.host/cgi-bin/php/secretdir/script.php3. Вместо того чтобы выполнить запрос, PHP выполняет только грамматический разбор в этом способе если он выполнил правила перенаправления вебсервера.

Обычно переадресация в конфигурации Apache сделана со следующими директивами:

Action php3-script /cgi-bin/php
AddHandler php3-script .php3

Эта опция была протестирована только с веб-сервером Apache, и полагается на Apache чтобы установить не-стандартную внешнюю переменную CGI REDIRECT_STATUS для перенаправленных запросов. Если ваш сервер паутины не поддерживает какого-либо способа сообщать что запрос прямой или перенаправленный, Вы не можете использовать эту опцию и Вы должны использовать один из других путей запуска версии CGI, документированной здесь.

Вариант 3: установка doc_root или user_dir

Размещение активного содержания, такого как скрипты и модули, в каталогах документов веб-сервера иногда является небезопасной практикой. Если при некоторой ошибке конфигурации сценарии не выполняются, они отображаются как обычные HTML документы, что может закончиться утечкой интеллектуальной собственности или информации безопасности подобно паролям. Поэтому многие сисадмины предпочитают устанавливать другие каталоги для сценариев, которые будут доступны только через PHP CGI и, следовательно, всегда проинтерпретированы и не отображены как таковые.

Также, если недоступен метод перенаправления неуверенных запросов, как описано в предыдущем разделе, необходимо установить корневой каталог(doc_root) сценариев, который отличается от корневого каталога веб-документов.

Вы можете установить корневой каталог для скриптов директивой конфигурации doc_root в файле php3.ini , или вы можете установить переменную окружения PHP_DOCUMENT_ROOT. Если это установлено, CGI-версия PHP всегда будет добавлять doc_root и путь к файлу в запросах, так что вы всегда будете уверенны что за пределами этого каталога скрипты выполняться не будут (кроме user_dir //см.ниже).

Другая используемая опция - user_dir. Когда user_dir - не установлена, открытием файла управляет только doc_root. Открытие URL подобно http://my.host/~user/doc.php3 не даст результата при открытии файла из каталога пользователя, но вызывается файл ~user/doc.php3 из каталога doc_root (да,имя каталога начинается с тильды [~]).

Если user_dir установлена, например как public_php, запрос, подобный http://my.host/~user/doc.php3 откроет файл doc.php3 в каталоге public_php домашнего каталога пользователя. Если это /home/user, то выполняется /home/user/public_php/doc.php3.

user_dir задается независимо от doc_root, так что вы можете контролировать доступ к document root и user directory отдельно.

Вариант 4: PHP синтаксический анализатор вне дерева web

Очень безопасная опция должна установить синтаксический анализатор PHP где-нибудь вне дерева файлов web. В /usr/local/bin, например. Обратная сторона этой опции заключается в том что вы должны вставлять строку подобно:

#!/usr/local/bin/php

в первую строку любого документа, содержащего PHP тэги. Кроме того, вы должны сделать файлы выполнимыми. Точно так же, как Вы поступаете с любым другим сценарием CGI записанным в Perl или sh или любом другом языке, который использует #! shell-escape механизм для самозапуска.

Чтобы PHP получил возможность корректно оперировать с PATH_INFO и PATH_TRANSLATEDпри такой установке, php анализатордолжен быть скомпилирован с опцией конфигурации --enable-discard-path

Модуль Apache

Когда PHP используется как Apache модуль, не наследуются права пользователя Apache (обычно таковые - "nobody").


Часть 6. Элементы языка

Любой скрипт PHP состоит из последовательности операторов. Оператор может быть присваиванием, вызовом функции, циклом, условным выражением или пустым выражением (ничего не делающим). Операторы обычно заканчиваются точкой с запятой. Также операторы могут быть объединены в группу заключением группы операторов в фигурные скобки. Группа операторов также является оператором. В этой части описаны различные типы операторов.

Константа

PHP определяет несколько констант и предоставляет механизм для определения Ваших констант. Константы похожи на переменные, но они имеют слегка изменЈнный синтаксис.

ПредопределЈнные константы - это __FILE__ and __LINE__, которые соответствуют имени файла и номеру строки, которая выполняется в настоящий момент.

Пример 6-1. Использование __FILE__ и __LINE__

<?php
function report_error($file, $line, $message) {
    echo "An error occured in $file on line $line: $message.";
}

report_error(__FILE__,__LINE__, "Something went wrong!");
?>

Вы можете определить дополнительные константы с помощью функций define() и undefine() .

Пример 6-2. Описание констант

<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // outputs "Hello world."
undefine ("CONSTANT");
?>

Выражения

Выражения - это краеугольный камень PHP. В PHP почти всЈ является выражениями. Простейший и наиболее точный способ определить выражение - это "что-то, имеющее значение".

Простейший пример, приходящий на ум это константы и переменные. Когда вы печатаете "$a = 5", вы присваиваете значение '5' переменной $a. '5', очевидно, имеет значение 5, иными словами'5' это выражение со значением5 (в данном случае'5' это целочисленная константа).

После этого присваивания вы считаете значением $a 5, также, если вы напишете $b = $a, вы будете ожидать того же как, если бы вы написали $b = 5. Другими словами, $a это также выражение со значением 5. Если всЈ написано правильно, то именно так оно и случиться.

Несколько более сложные примеры выражений - это функции. К примеру, подумайте на следующей функцией :

function foo () {
    return 5;
}

Подразумевая, что вы знакомы с концепциями функции (если нет, взгляните на часть, посвящЈнную функциям), вы считаете, что $c = foo() это практически то же самое, что написать $c = 5 и вы правы. Функции - это выражения с тем значением, которое они возвращают. Так как foo() возвращает 5, значение выражение 'foo()' - 5. Обычно функции подсчитывают возвращаемое значение,а не возвращают постоянное значение.

Конечно, значения в PHP не обязаны быть целыми и зачастую они не являются таковыми. PHP поддерживает 3 скалярных типа значений : целое, число с плавающей точкой и строки ( скалярные выражения вы не можете "разбить" на более маленькие части, как, к примеру, массивы). PHP поддерживает 2 составных (нескалярных) типа : массивы и объекты. Каждое из таких значений может быть присвоено переменной или возвращено функцией.

Итак, пользователи PHP/FI 2 не должны почувствовать каких-то перемен. PHP это язык, ориентированный на выражения, практически всЈ является выражениями.Обратимся к примеру, с которым мы уже разобрались, '$a = 5'. Легко заметить, что тут задействованы два значения - значение целой константы 5 и значение $a, которое также становиться равным 5.На самом деле здесь присутствует ещЈ одно значение, значение самого присваивания. Само присваивание становиться равным присваиваемому значению, в данном случае - 5.На практике это означает, что '$a = 5', не обращая внимания на то, что оно равно выражению со значением 5. То есть, запись типа '$b = ($a = 5)' похожа на запись'$a = 5; $b = 5;' (точка с запятой отмечает конец выражения). Так как присваивания рассматриваются справа налево, вы также можете написать '$b = $a = 5'.

Другой хороший пример направления выражения это прежварительное и последующее увеличение и уменьшение. Рользователи PHP/FI 2 и многих других языков могут быть знакомы с записями variable++ and variable--. Это операторы увеличения и уменьшения. В PHP/FI 2, оператор '$a++' не имеет значения(не является выражением), поэтому вы не можете его присвоить или использовать как-либо иначе. PHP расширяет возможность увеличения/уменьшения делая его выражением, как и в C. В PHP, подобно C, есть 2 типа инкремента - предварительный и последующий. И предыдущий и последующий инкремент увеличивает значение переменной и воздействие на переменную идентично.Разница в значении выражения инкремента. Предыдущее увеличение, которое записывается как '++$variable', приравнивается увеличенной переменной (PHP увеличивает переменную до того, как прочитать еЈ значение). Post-increment, which is written '$variable++' evaluates to the original value of $variable, before it was incremented (PHP increments the variable after reading its value, thus the name 'post-increment').

Очень распространЈнный тип выражений это выражения сравнения. Эти выражения имеют значение 0 или 1 (означает ложь или истину соответственно). PHP поддерживает > (больше, чем), >= ( больше или равно), = (равно), < (меньше,чем) и <= (меньше или равно). Эти выражения в основном используются внутри условий, например оператора IF.

Последний пример выражений, с которыми мы разберЈмся, это совмещЈнные выражения оператор-присваивание. Вы уже знаете, что для того, чтобы увеличить значение $a на еденицу, вы можете написать '$a++' или '++$a'. Но если следует увеличить значение больше, чем на еденицу, к примеру - на 3? Вы можете написать '$a++' несколько раз, но это не очень удобно и эффективно. Намного больше распространено написание '$a = $a + 3'. '$a + 3' вычисляется, как значение $a плюс 3, а затем присваивается переменной $a, в результате чего значение $a увеличивается на 3. В PHP, также как и в ряде других языков типа C, вы можете записать это короче, что со временем бывает проще и быстрее также и для понимания. Добавление 3 к текущему значению $a может быть записано как '$a+=3'. Это значит следующее : 'возьми значение $a, добавь к нему 3 и присвой это обратно $a. Кроме того, что это быстрее и понятнее, такой тип выражений быстрее исполняется. Значение '$a+=3' как и значение обычного присваивания это присвоенное значение. Заметьте, что оно не равно 3, а является общим значением $a и 3. Любой бинарный (имеющий 2 операнда - прим. пер.) оператор может быть записан таким методом, например : '$a-=5' (вычесть 5 из значения $a), '$b*=7' (умножиить значение $a на 7) и так далее.

Есть ещЈ такое выражение, которое может показаться незнакомым, если вы не встречались с ним в других языках - условный оператор с тремя операндами :

$first ? $second : $third

Если значение первого выражения истинно (не равно 0), то испольняется второе выражение и это является результатом данного условного выражения. Иначе исполняется третий оператор.

Этот пример должен помочь Вам лучше понять предварительное и последующее увеличение и вообще выражения ?

function double($i) /* функция удваивания переменной */
{
return $i*2;
}
$b = $a = 5; /* присваиваем значения переменым $a и $b */
$c = $a++; /* последующее увеличение, присваиваем $c начальное значение $a (5)*/
$e = $d = ++$b; /* предварительное увеличение, присваиваем $d и $e увеличенное значение$b (6) */
/* тут и $d и$e равны6 */
$f = double($d++); /* присвоить удвоенное значение $d до его увеличения, то есть 2*6 = 12, переменной $f*/
$g = double(++$e); /* присвоить удвоенное значение $e после его увеличения, то есть 2*7 = 14, переменной g */
$h = $g += 10; /* сначала увеличить значение $g на 10, что даЈт в результате 24, а затем присвоить это значение переменной $h, что также даЈт 24 */

В начале главы мы сказали, что объясним различные типы операторов и, как и было обещано выражения могут быть операторами. Впрочем, не каждое выражения является оператором. В данном случае оператор имеет форму 'выражение' ';', то есть выражение, за которым следует точка с запятой. В '$b=$a=5;' $a=5 это правильное выражение, но само по себе оно не является оператором. А вот '$b=$a=5;' является правильным оператором.

ЕщЈ одна вещь, которую нужно упомянуть - это логические значения выражений. Во многих случаях, в основном в условных операторах и операторах циклов, вы не заинтересованы в конкретных значениях выражений, а только являются ли их значения TRUE или FALSE (в PHP нет специального типа boolean). Логические значения вычисляются примерно так же, как я в языке Perl. Любое не нулевое целое значение - это TRUE, ноль - это FALSE. Обратите внимание на то, что отрицательные значения - это не ноль и поэтому они считаются равными TRUE. Пустая строка и строка '0' это FALSE; все остальные строки - TRUE. И насчЈт составных типов (массивы и объекты) - если значение такого типа не содержит элементов, то оно считается равным FALSE; иначе подразумевается TRUE.

PHP предоставляет полную и мощную реализацию выражений и подробное еЈ описание выходит за пределы этого руководства. ПриведЈнные выше примеры показали вам, что такое выражения и как вы можете построить реальные выражения. В остальной части руководства мы будем писать 'expr' для обозначения любого правильного выражения PHP.

IF

Структура IF это одна из важнейших возможностей многих языков, включая PHP. Она позволяет организовать выполнение фрагментов кода по условию. Возможности PHP по использованию выражения IF похожи на C:

if (expr) statement

Как объяснялось в части про выражения, вычисляется логический результат "expr" . Если expr равно TRUE, то PHP выполнит "statement", а если FALSE - проигнорирует.

Следующий пример выведет фразу 'a is bigger than b' если $a больше $b:

if ($a > $b)
    print "a is bigger than b";

Зачастую Вам требуется исполнить больше чем одно выражение по условию. Конечно, не надо окружать каждое выражение конструкцией IF. Вместо этого вы можете сгруппировать несколько выражений в блок выражений. К примеру, слежующий код не только выведет фразу, но и присвоит значение $a переменной $b:

if ($a > $b) { print "a is bigger than b"; $b = $a; }

Выражение IF может иметь неограниченную степень вложенности в другие выражения IF, что позволяет Вам эффективно использовать выполнение по условию различных частей программы.

ELSE

Зачастую Вам требуется исполнить одно выражение, если соблюдается какое-либо условие и другое выражение в противном случае. Вот для этого применияется ELSE. ELSE расширяет возможности IF по части обработки вариантов выражения, когда оно равно FALSE. Данный пример выведет фразу 'a is bigger than b' если $a больше $b, и 'a is NOT bigger than b' в противном случае:

if ($a > $b) {
    print "a is bigger than b";
} else {
    print "a is NOT bigger than b";
}

Выражение ELSE выполняется только если выражение IF равно FALSE, а если есть конструкции ELSEIF - то если и они также равны FALSE (см. ниже).

ELSEIF

ELSEIF, как и следует из его названия, является комбинацией IF и ELSE. ELSEIF как и ELSE позволяет выполнить выражение, если значение IF равно FALSE, но в отличие от ELSE оно выполнится только если выражение ELSEIF равно TRUE.К примеру, следующий код выведет 'a is bigger than b' если$a>$b, 'a is equal to b' если $a==$b, и 'a is smaller than b' если$a<$b:

if ($a > $b) {
    print "a is bigger than b";
} elseif ($a == $b) {
    print "a is equal to b";
} else {
    print "a is smaller than b";
}

Внутри одного выражения IF может быть несколько ELSEIF. Первое выражение ELSEIF (если таковые есть), которое будет равно TRUE, будет выполнено. В PHP3 вы можете написать 'else if' (два слова), что будет значить то же самое, что и 'elseif' (одно слово).

Выражение ELSEIF будет выполнено только если выражение IF и все предыдущие ELSEIF равно FALSE, а данный ELSEIF равен TRUE.

Иной синтаксис для оператора IF : IF(): ... ENDIF;

PHP3 предлагает иной путь для группирования операторов с оператором IF. Наиболее часто это используется когда вы внедряете блоки HTML внутрь оператора IF, но вообще может использоваться где угодно. Вместо использования фигурных скобок за "IF(выражение)" должно следовать двоеточие, одно или несколько выражений и завершающий ENDIF. Рассмотрите слежующий пример :

<?php if ($a==5): ?> A = 5 <?php endif; ?>

В этом примере блок "A = 5" внедрЈн внутрь выражения IF, используемого альтернативным способом. Блок HTML будет виден только если $a равно 5.statement written in the alternative syntax.

Этот альтернативный синтаксис применим и к ELSE и ELSEIF (expr) .Вот пример подобной структуры :

if ($a == 5):
    print "a equals 5";
    print "...";
elseif ($a == 6):
    print "a equals 6";
    print "!!!";
else:
    print "a is neither 5 nor 6";
endif;

WHILE

Цикл WHILE - простейший тип цикла в PHP3. Он действует как и его аналог в C. Основная форма оператора WHILE :

WHILE(expr) statement

Смысл оператора WHILE прост. Он предписывает PHP выполнять вложенный(е) оператор(ы) до тех пор пока expr равно TRUE. Значение выражения проверяется каждый раз при начале цикла, так что если значение выражения изменится внутри цикла, то он не прервЈтся до конца текущей итерации (выполнение всего блока вложенных операторов - это одна итерация). Иногда, если значение expr равно FALSE с самого начала, цикл не выполняется ни разу.

Как и в IF, вы можете сгруппировать несколько операторов внутри фигурных скобок или использовать альтернативный синтаксис :

WHILE(expr): выражения ... ENDWHILE;

Следующие примеры идентичны - оба выводят номера с 1 по 10:

/* example 1 */

$i = 1;
while ($i <= 10) {
    print $i++;  }

/* example 2 */

$i = 1;
while ($i <= 10):
    print $i;
    $i++;
endwhile;

DO..WHILE

Цикл DO..WHILE очень похож на WHILE за исключением того, что значение логического выражения проверяется не до, а после окончания итерации. Основное отличие в том, что DO..WHILE гарантировано выполнится хотя бы один раз, что в случае WHILE не обязательно.

Для циклов DO..WHILE существует только один вид синтаксиса:

$i = 0;
do {
    print $i;
} while ($i>0);

Этот цикл выполнится один раз, так как после окончания итерации будет проверено значение логического выражения, а оно равно FALSE ($i не больше 0), и выполнение цикла завершится.

Опытные программисты на C может быть знакомы с иным использованием DO..WHILE, позволяющем прекратить исполнение блока операторов в середине путЈм внедрения его в цикл DO..WHILE(0) и использования оператора BREAK. Следующий код демонстрирует такую возможность :

do {
    if ($i < 5) {
        print "i is not big enough";
        break;
    }
    $i *= $factor;
    if ($i < $minimum_limit) {
        break;
    }
    print "i is ok";
    ...process i...
} while(0);

Не беспокойтесь, если вы не совсем поняли это. Вы можете программировать весьма мощные скрипты и без этой возможности.

FOR

Циклы FOR - наиболее мощные циклы в PHP. Они работают подобно их аналогам в C. Синтаксис цикла FOR :

FOR (expr1; expr2; expr3) statement

Первое выражение (expr1) безусловно вычисляется(выполняется) в начале цикла.

В начале каждой итерации вычисляется expr2. Если оно равно TRUE, то цикл продолжается и выполняются вложенный(е) оператор(ы). Если оно равно FALSE, то цикл заканчивается.

В конце каждой итерации вычисляется(исполняется) expr3.

Каждое из этих выражений может быть пустым. Если expr2 пусто, то цикл продолжается бесконечно (PHP по умолчанию считает его равным TRUE, как и С). Это не так бесполезно, как могло бы показаться, так как зачастую вам требуется закончить выполнение цикла используя оператор BREAK в сочетании с логическим условием вместо использования логического выражения в FOR.

Рассмотрим следующие примеры. Все они выводят номера с 1 по 10 :

/* пример 1 */

for ($i = 1; $i <= 10; $i++) {
    print $i;
}

/* пример 2 */

for ($i = 1;;$i++) {
    if ($i > 10) {
        break;
    }
    print $i;
}

/* пример 3 */

$i = 1;
for (;;) {
    if ($i > 10) {
        break;
    }
    print $i;
    $i++;
}

/* пример 4 */

for ($i = 1; $i <= 10; print $i, $i++) ;

Конечно, первый вариант кажется лучшим (или четвЈртый), но оказывавется возможность использования пустых выражений в цикле FOR зачастую оказывается полезной.

PHP также поддерживает альтернативный синтаксис FOR :

FOR (expr1; expr2; expr3): выражение; ...; endfor;

Другие языки используют оператор foreach для того, чтобы обрабатывает массивы или списки. PHP использует для этого оператор while и функции list() и each() . Для примера смотрите документацию по этим функциям.

BREAK

VREAK прерывает выполнение текущего цикла.

$i = 0;
while ($i < 10) {
    if ($arr[$i] == "stop") {
        break;
    }
    $i++;
}

CONTINUE

CONTINUE переходит на начало ближайшего цикла.

while (list($key,$value) = each($arr)) {
    if ($key % 2) { // skip even members
        continue;
    }
    do_something_odd ($value);
}

SWITCH

Оператор SWITCH похож на группу операторов IF с одинаковым выражением. Во многих случаях вам нужно сравнить переменную (или выражение) со многими различными значениями и выполнить различные фрагменты кода в зависимости от того, чему будет равно значение выражения. Это как раз то, для чего предназначается оператор SWITCH.

Следующие 2 примера это 2 разлчиных пути для достижения одной вещи, но один использует серию операторов IF, а другой - оператор SWITCH.

/* пример 1 */

if ($i == 0) {
    print "i equals 0";
}
if ($i == 1) {
    print "i equals 1";
}
if ($i == 2) {
    print "i equals 2";
}

/* пример 2 */

switch ($i) {
    case 0:
        print "i equals 0";
        break;
    case 1:
        print "i equals 1";
        break;
    case 2:
        print "i equals 2";
        break;
}

Важно понять как работает оператор SWITCH чтобы избежать ошибок. SWITCH выполняет последовательно оператор за оператором. В начале код не исполняется. Только когда встречается оператор CASE с подходящим значением, PHP начинает выполнять программу. PHP продолжает выполнять операторы до конца блока SWITCH или пока не встретит оператор BREAK. Если вы не напишете BREAK в конце цикла операторов, то PHP продолжит выполнять операторы и следующего SWITCH'а. К примеру :

/* пример 3 */

switch ($i) {
    case 0:
        print "i equals 0";
    case 1:
        print "i equals 1";
    case 2:
        print "i equals 2";
}

В этом случае, если $i равно 0, то PHP выполнит все операторы print! Если $i равно 1, то PHP выполнит последние два print. И только если $i равно 2, вы получите ожидаемый результат и выведено будет только 'i equals 2'. Так что важно не забывать ставить BREAK (разве что в некоторых случаях вы специально не захотите их ставить для достижения определЈнной цели).

Специальный случай - это 'default case'. Этот оператор соответствует всем значениям, которые не удовлетворяют другим case'ам. К примеру :

/* example 4 */

switch ($i) {
    case 0:
        print "i equals 0";
        break;
    case 1:
        print "i equals 1";
        break;
    case 2:
        print "i equals 2";
        break;
    default:
        print "i is not equal to 0, 1 or 2";
}

Другой заслуживающий упоминания факт - это то, что выражения в CASE могут быть любого скалярного типа, то есть целые числа или числа с плавающей запятой, а так же строки. Массивы и объекты не будут ошибкой, но в данном случае они не имеют значимости.

REQUIRE

Оператор REQUIRE заменяет себя содержимым указанного файла, похоже на то,как в препроцессоре C работает #include.

Это означает, что вы не можете поместить require() внутрь цикла и ожидать, что он включит содержимое дугого файла несколько раз в процессе каждой итерации. Для это используйте INCLUDE.

require ('header.inc');

INCLUDE

Оператор INCLUDE вставляет и выполняет содержимое указанного файла.

Это случается каждый раз, когда встречается оператор INCLUDE, так что вы можете включить этот оператор внутрь цикла, чтобы включить несколько файлов :

$files = array ('first.inc', 'second.inc', 'third.inc');
for ($i = 0; $i < count($files); $i++) {
    include($files[$i]);
}

include() отличается от require() тем, что оператор include выполняется каждый раз при его встрече, а require() заменяется на содержимое указанного файла безотносительно будет ли выполнено его содержимое или нет

Так как include() это специальный оператор, требуется заключать его в фигурные скобки при использовании внутри условного оператора.

/* Это неправильно и не будет работать, как хотелось бы. */

if ($condition)
    include($file);
else
    include($other);

/* А вот это - верно. */

if ($condition) {
    include($file);
} else {
    include($other);
}

Когда файл исполняется, парсер пребывает в "режиме HTML", то есть будет выводить содержимое файла, пока не встретит первый стартовый тег PHP (<?).

Также смотрите readfile(), virtual().

FUNCTION

Функция может быть объявлена следующим образом:

function foo ($arg_1, $arg_2, ..., $arg_n) {
    echo "Example function.\n";
    return $retval;
}

Внутри функции может быть любой верный код PHP3, даже объявление другой функции или класса .

Функции должны быть определены перед тем, как на них ссылаться.

Возвращение результатов

Результаты возвращаются через необязательный оператор return. Возвращаемый результат может быть любого типа, включая списки и объекты.

function my_sqrt ($num) {
    return $num * $num;
}
echo my_sqrt (4);   // outputs '16'.

Множественные результаты не могут быть возврашены в качестве результата, но вы можете реализовать это путЈм возврата списка :

function foo() {
   return array (0, 1, 2);
}
list ($zero, $one, $two) = foo();

Аргументы

Информация может быть передана функции через список аргументов, которые являются разделЈнным запятыми списком переменных и/или констант.

PHP3 поддерживает передачу аргументов по значению (по умолчанию), по ссылке, и значения по умолчанию. Списки аргументов переменной длины не поддерживаются, но того же можно достичь, передавая массивы.

function takes_array($input) {
    echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}

Передача по ссылке

По умолчанию, аргменты функции передаются по значению. Если вы хотите в функции модифицировать аргументы, то можете передать их по ссылке.

Если вы хотите, чтобы аргумент всегда передавался по ссылке, то следует поставить амперсенд (&) перед именем аргумента в объявлении функции :

function foo( &$bar ) {
    $bar .= ' and something extra.';
}
$str = 'This is a string, ';
foo ($str);
echo $str;    // выведет :  'This is a string, and something extra.'

Если вы хотите передать аргумент по ссылке в случае, когда по умолчанию такого не делается, то добавьте амперсенд перед именем аргумента в вызове функции :

function foo ($bar) {
    $bar .= ' and something extra.';
}
$str = 'This is a string, ';
foo ($str);
echo $str;    // выведет 'This is a string, '
foo (&$str);
echo $str;    // выведет 'This is a string, and something extra.'

Значения по умолчанию

Функции могут определять значения по умолчанию для скалярных аргументов в стиле C++ как показано :

function makecoffee ($type = "cappucino") {
    echo "Making a cup of $type.\n";
}
echo makecoffee ();
echo makecoffee ("espresso");

Этот пример выведет следующее :

Making a cup of cappucino.
Making a cup of espresso.

Значение по умолчанию должно быть константой, а не переменной или, к примеру, членом класса.

Учтите, что когда вы объявляете аргументы по умолчанию, они должны быть справа от всех "неумолчальных" аргументов, в противном случае это не будет работать, как задумано. К примеру :

function makeyogurt ($type = "acidophilus", $flavour) {
    return "Making a bowl of $type $flavour.\n";
}

echo makeyogurt ("raspberry");   // не будет работать, как ожидалось

Этот пример выведет следующее :

Warning: Missing argument 2 in call to makeyogurt() in
/usr/local/etc/httpd/htdocs/php3test/functest.html on line 41
Making a bowl of raspberry .

А теперь сравните с этим :

function makeyogurt ($flavour, $type = "acidophilus") {
    return "Making a bowl of $type $flavour.\n";
}

echo makeyogurt ("raspberry");   // а вот это работает

И выводит следующее :

Making a bowl of acidophilus raspberry.

OLD_FUNCTION

Оператор OLD_FUNCTION позволяет вам определяить функцию использую синтаксис PHP/FI2 (за исключением того, что вы должны заменить 'function' на 'old_function').

Это свойство только для совместимости и должно использоваться лишь конверторами PHP/FI2 -> PHP3.

Описанные таким образом функции не могут быть вызваны из служебного кода PHP. Это к тому же значит, что вы не можете использовать их в функциях типа usort(), array_walk() и register_shutdown_function(). Вы можете обойти это путЈм введения специальной функции в терминах PHP3, которая будет вызывать OLD_FUNCTION.

CLASS

Класс - это набор переменных и функций, работающих с этими переменными. Класс определяется следующим образом :

<?php
class Cart {
    var $items;  // Количество вещей в корзине покупателя

    // Добавить $num наименований типа $artnr в корзину

    function add_item ($artnr, $num) {
        $this->items[$artnr] += $num;
    }

    // Убрать $num наименований  $artnr из корзины

    function remove_item ($artnr, $num) {
        if ($this->items[$artnr] > $num) {
            $this->items[$artnr] -= $num;
            return true;
        } else {
            return false;
        }
    }
}
?>

Это определения класса Cart, который состоит связного списка наименований товаров в корзине и двух функций для добавления и удаления вещей из корзины.

Классы это типы, то есть, заготовки для реальных переменных. Вы должны создавать переменные желаемого типа, используя оператор new :

$cart = new Cart;
$cart->add_item("10", 1);

Таким образом, мы создали объект $cart класса Cart. Функция add_item() этого объекта вызывается для добавления 1 товара номер 10 к корзине.

Классы могут быть расширениями других классов. Расширенный класс обладает всеми переменными и функциями базового класса и тем, что вы определите при расширении класса. Это делается используя ключевое слово extends :

class Named_Cart extends Cart {
    var $owner;

    function set_owner ($name) {
        $this->owner = $name;
    }
}

Это определяет класс Named_Cart, который имеет все переменные и функции класса Cart плюс дополнительную переменную $owner и дополнительную функцию set_owner(). Вы можете создать поименованую корзину обычным образом и установить или получить владельца корзины. Также вы можете использовать и нормальные функции корзины в поименованой корзине :

$ncart = new Named_Cart;    // Создать корзину
$ncart->set_owner ("kris"); // Указать владельца
print $ncart->owner;        // Распечатать имя владельца корзины
$ncart->add_item ("10", 1); // (унаследовано из обычной корзины)

Внутри функций класса переменная $this означает сам объект. Вы должны использовать $this->нечто для доступа к переменной или функции с именем 'нечто' внутри объекта.

Конструкторы это функции в классе, которые автоматически вызываются, когда вы создаЈте новую переменную данного класса. Функция становится классом, когда она имеет такое же имя, как и сам класс.

class Auto_Cart extends Cart {
    function Auto_Cart () {
        $this->add_item ("10", 1);
    }
}

Мы определили класс Auto_Cart который является тем же классом Cart плюс имеет конструктор, который инициализирует корзину при создании, наполняя еЈ одним товаром типа "10". Конструкторы также могут иметь аргументы, и эти аргументы могут быть необязательными, что делает конструктор более полезным :

class Constructor_Cart {
    function Constructor_Cart ($item = "10", $num = 1) {
        $this->add_item ($item, $num);
    }
}

// Покупаем вся одно и то же :

$default_cart   = new Constructor_Cart;

// А тут что-то новое :

$different_cart = new Constructor_Cart ("20", 17);


Глава 7. Выражения

Операторы

Арифметические операторы

Помните основную арифметику из школы? Эти операторы работают подобным образом

Таблица 7-1. Арифметические операторы

пример | название | результат
$a + $b | Сложение | Сумма $a и $b.
$a - $b | Вычитание | Вычитает $b из $a.
$a * $b | Умножение | Произведение $a и $b.
$a / $b | Деление | Деление $a на $b.
$a % $b | Остаток деления | Остаток от деления $a на $b.

Оператор деления("/") возвращает целую величину(результат целочисленного деления) если оба оператора - целые (или строка преобразованная в целое). Если каждый операнд является величиной с плавающей запятой, выполнится деление с плавающей запятой.

Операторы строк

B действительности есть только один оператор -- оператор конкатенации (".").

$a = "Hello ";
$b = $a . "World!"; // теперь $b = "Hello World!"

Операторы присваивания

Основным оператором присваивания является "=". Вы могли подумать что это "равно"("equal to"). Но это не так. В действительности это означает что левый операнд получает значение выражения в правых (собирательное присваивание).

Значением выражения присваивания является присваиваемая величина. Так что если "$a = 3", то это 3. Это позволит Вам делать некоторые мудреные вещи:

$a = ($b = 4) + 5; // теперь $a равно 9, а $b стало равным 4.

В дополнение к основным операторам присваивания есть дополнительные "комбинационные операторы",для всех арифметических и строковых операторов, что позволяет Вам использовать значение в выражении и затем устанавливать свое значение в результате этого выражения. Например:

$a = 3;
$a += 5; // теперь $a равно 8, как если бы мы сказали: $a = $a + 5;
$b = "Hello ";
$b .= "There!"; // теперь $b равно "Hello There!", как если бы мы написали $b = $b . "There!";

Бинарные Операторы(Побитовые Логические Операторы)

Бинарные Операторы позволяют вам изменять биты в целых числах.

Table 7-2.Бинарные Операторы

пример | название | результат
$a & $b | И | Будут установлены биты, которые были установлены и в $a и в $b. *Пример вебклуба: $a=5; /* 0101 */ $b=12; /* 1100 */ $c=$a & $b; /* $c будет равно 4 (0100) */
$a | $b | Или | Будут установлены биты, установленные в $a или $b . *Пример вебклуба: $a=5; /* 0101 */ $b=12; /* 1100 */ $c=$a|$b; /* $c будет (1101) */
~ $a | Не | Будут установлены не_присутствующие в $a биты (реверс) *Пример вебклуба: $a=5; /* 0101 */ ~ $a /* $a будет равно x (1010) */

Логические операторы

Таблица 7-3. Логические операторы

пример | название | результат
$a and $b | И | Истина, если истинны $a и $b.
$a or $b | Или | Истина, если истинны $a или $b.
$a xor $b | Или | Истина, если истинны $a или $b, но не оба.
! $a | Не | Истина, если не истинно $a.
$a && $b | И | Истина, если истинны и $a и $b.
$a || $b | Или | Истина, если истинны $a или $b.

Разница в двух различных вариантах операторов "and" и "or" - в различии приоритетов операций. (см. ниже)

Операторы Сравнения

Операторы Сравнения, как и подразумевается в их имени, позволяют Вам сравнивать две величины.

Таблица 7-4. Операторы Сравнения

пример | название | результат
$a == $b | равно | истина, если $a эквивалентно $b.
$a != $b | Не равно | Истина, если $a не эквивалентно $b.
$a < $b | Меньше чем | Истина если $a меньше чем $b.
$a > $b | Больше чем | Истина если $a больше $b.
$a <= $b | Меньше или равно | Истина, если $a меньше или равно $b.
$a >= $b | Больше или равно | Истина, если $a больше или равно $b.

Приоритет Операций


IV. Математические BC (Произвольной Точности) Функции

Данные BC функции задействованы только при условии что PHP был скомпилирован в режиме --enable-bcmath, т.е. при включенных в конфигурацию bcmath функциях.

bcadd

bcadd -- Сложение двух чисел произвольной точности.

Описание

string bcadd(string левый операнд, string правый операнд, int [масштаб]);

Прибавляет левый операнд к правому операнду и возвращает сумму типа string (строковая переменная). Факультативный параметр масштаб используется чтобы установить количество разрядов после десятичной отметки в результате.

Смотрите также bcsub().

bccomp

bccomp -- Сравнение двух чисел произвольной точности.

Описание

int bccomp(string левый операнд, string правый операнд, int [масштаб]);

Сравнивает левый операнд с правым операндом и возвращает результат типа integer (целое). Факультативный параметр масштаб используется для установки количества цифр после десятичной отметки, используемых при сравнении. При равенстве двух операндов возвращается значение 0. Если левый операнд больше правого операнда возврашается +1, и если левый операнд меньше правого операнда возвращается -1.

bcdiv

bcdiv -- Операция деления для двух чисел произвольной точности.

Описание

string bcdiv(string левый операнд, string правый операнд, int [масштаб]);

Делит левый операнд на правый операнд и возвращает результат. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

Смотрите также bcmul().

bcmod

bcmod -- Получение модуля числа произвольной точности.

Описание

string bcmod(string левый операнд, string модуль);

Получение модуля левого операнда используя операнд модуль.

Смотрите также bcdiv().

bcmul

bcmul -- Операция умножения для двух чисел произвольной точности.

Описание

string bcmul(string левый операнд, string правый операнд, int [масштаб]);

Умножает левый операнд на правый операнд и возвращает результат. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

Смотрите также bcdiv().

bcpow

bcpow -- Возведение одного числа произвольной точности в степень другого.

Описание

string bcpow(string x, string y, int [масштаб]);

Возведение x в степень y. Параметр масштаб может использоваться для установки количества цифр после десятичной отметки в результате.

Смотрите также bcsqrt().

bcscale

bcscale -- Устанавливает масштаб по умолчанию для всех математических BC-функций

Описание

string bcscale(int масштаб);

Эта функция устанавливает заданный по умолчанию параметр масштаба для всех последующих математических BC-функций, которые явно не определяют параметр масштаба.

bcsqrt

bcsqrt -- Получение квадратного корня числа произвольной точности.

Описание

string bcsqrt(string операнд, int масштаб);

Возвращает кваддратный корень операнда. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

Смотрите также bcpow().

bcsub

bcsub -- Вычитает одно число произвольной точности из другого.

Описание

string bcsub(string левый операнд, string правый операнд, int [масштаб]);

Вычитает правый операнд из левого операнда и возвращает результат типа string. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.

Смотрите также bcadd().


V. Календарные Функции

JDToGregorian
GregorianToJD
JDToJulian
JulianToJD
JDToJewish
JewishToJD
JDToFrench
FrenchToJD
JDMonthName
JDDayOfWeek

Календарные функции - доступны только если Вы скомпилировали календарное расширение в dl/php3_11. Смотрите dl/README для получения инструкций.

Календарное расширение в PHP представляет серию функций, которая упрощает преобразование между разными календарными форматами. Посредником прообразования является дневной Юлианский счет. Дневной Юлианский счет это самый старый счет дней (около 4000 д.э.). Чтобы менять числа между разными календарными системами, Вы должны сначала преобразовать вашу дату в дневной Юлианский счет, а только затем в календарную систему по вашему выбору. Дневной Юлианский счет отличается от Юлианского Календаря! Более подробно о календарной систем смотрите на сайте: http://genealogy.org/~scottlee/cal-overview.html. Отрывки с этой страницы включаются в данной инструкцие.

JDToGregorian

JDToGregorian -- Преобразование дневного Юлианcкого счета в Грегорианскую дату

Описание

string jdtogregorian(int julianday);

Преобразование дневного Юлианcкого счета в Грегорианскую в формате "месяц/день/год"

GregorianToJD

GregorianToJD -- Преобразовывает Грегорианскую дату на Дневный Юлианский cчет

Описание

int gregoriantojd(int month, int day, int year);

Правильный дипазон для Грегорианского календаря 4714 д.э. до 9999 н.э.

Хотя это программное обеспечение может оперировать даты в обратном порядке до 4714 д.э., такое использование может быть бесполезно и не значительно. Грегорианский календарь не был учрежден до Октября 15, 1582 (или Октябрь 5, 1582 в Юлианском календаре). Некоторые страны еще очень долго не принимали его. Например, Великобритания преобразовалась в 1752, СССР в 1918 и Греции в 1923. Наиболее Европейские страны использовали Юлианский Календарь До Грегорианского.

Пример 1. Календарные функции

<?php
$jd = GregorianToJD(10,11,1970);
echo("$jd\n");
$gregorian = JDToGregorian($jd);
echo("$gregorian\n");
?>

JDToJulian

JDToJulian -- преобразовывает дату Юлианского календаря на дневный Юлианский счет

Описание

string jdtojulian(int julianday);

Преобразование дневного Юлианского счета в строку, содержащую дату Юлианского Календаря в формате "месяц/день/год".

JulianToJD

JulianToJD -- преобразовывает дату Юлианского Календаря на дневной Юлианский счет

Описание

int juliantojd(int month, int day, int year);

Правильный дипазон для Юлианского календаря 4713 д.э. до 9999 н.э.

Хотя это программное обеспечение может оперировать даты в обратном порядке до 4713 д.э. такое использование может быть бесполезно и не значительно. Календарь был создан в 46 д.э., но подробные не стабилизировался до по крайней мере 8 н.э., и возможно познее в 4-ом столетии. Также, начало года различно от одной культуры к другой - не все соглашаются, что Январь это первый месяц.

JDToJewish

JDToJewish -- преобразовывает дневной Юлианский счет в Еврейский календарь

Описание

string jdtojewish(int julianday);

Преобразование дневного Юлианского счета в Еврейский календарь

JewishToJD

JewishToJD -- преобразовывает дату в Еврейском Календаре на дневной Юлианский счет

Описание

int jewishtojd(int month, int day, int year);

Еврейский календарь использовался в течение нескольких тысячалетий, но в течение начального периода не было никакой формулы, чтобы определить начало месяца. Новый месяц начинался когда замечено полнолуние.

JDToFrench

JDToFrench -- преобразовывает дневной Юлианский счет в Французский Республиканский календарь

Описание

string jdtofrench(int month, int day, int year);

преобразовывает дневной Юлианский счет в Французский Республиканский календарь

FrenchToJD

FrenchToJD -- преобразовывает дату и Французского Республиканского календаря в дневной Юлианский счет

Описание

int frenchtojd(int month, int day, int year);

преобразовывает дату и Французского Республиканского календаря в дневной Юлианский счет

Эта программа преобразовывают даты в начиная с 1 до 14 (Грегорианские даты 22 Сентября 1792 до 22 1806 Сентября). Это покрывает тот период когда календарь использовался.

JDMonthName

JDMonthName -- возвращает название месяца

Описание

string jdmonthname(int julianday, int mode);

Возвращает строку с названием месяца. main сообщает функции, в какой календарь нужно преобразовать дневнрй Юлианский счет на, и какой тип месячных имен должен быть возвращен.

Стол 1. Календарные способы
Способ | Значение
0 | Грегорианский - apreviated
1 | Грегорианский
2 | Юлианский - apreviated
3 | Юлианский
4 | Еврейский
5 | Французский Республиканский

JDDayOfWeek

JDDayOfWeek -- Возвращает день недели

Описание

mixed jddayofweek(int julianday, int mode);

Возвращает день недели. Может возвратить строку(string) или int в зависимости от способа(mode).

Стол 1. Календарные недельные пути
Способ | Значение
0 | возвращает дневной номер как int (0=воскресенье, 1=понедельник, и т.п.)
1 | возврат string содержание дня недели (английское-грегорианское)
2 | возвращает string содержа abreviated дени недели (английский-грегорианский)


VI. Функции Даты/Времени

checkdate

checkdate -- проверяет правильность даты/времени

Описание

int checkdate(int month, int day, int year);

Возвращает true если данная дата правильна, иначе false. Проверяет правильность даты, заданной аргументами. Дата считается правильной, если:

  • год между 1900 и 32767 включительно

  • месяц между 1 и 12 включительно

  • день находится в диапазоне разрешенных дней данного месяца. Високосные годы учитываются.

date

date -- формат локального времени/даты

Описание

string date(string format, int timestamp);

Возвращает строку, отформатированную согласно данной строке и используя данную временную метку или текущее локальное время, если не задана временная метка.

В фоматной строке должны использоваться следующие символы:

  • a - "am" или "pm"

  • A - "AM" или "PM"

  • d - день месяца, цифровой, 2 цифры (на первом месте ноль)

  • D - день недели, текстовый, 3 буквы; т.е. "Fri"

  • F - месяц, текстовый, длинный; т.е. "January"

  • h - час, цифровой, 12-часовой формат

  • H - час, цифровой, 24-часовой формат

  • i - минуты, цифровой

  • j - день месяца, цифровой, без начальных нулей

  • l (строчная 'L') - день недели, текстовый, длинный; т.е. "Friday"

  • m - месяц, цифровой

  • M - месяц, текстовый, 3 буквы; т.е. "Jan"

  • s - секунды, цифровой

  • S - английский порядковый суффикс, текстовый, 2 символа; т.е. "th", "nd"

  • U - секунды с начала века

  • Y - год, цифровой, 4 цифры

  • w - день недели, цифровой, 0 означает воскресенье

  • y - год, цифровой, 2 цифры

  • z - день года, цифровой; т.е. "299"

Нераспознанные символы в форматной строке будут печататься как есть.

Пример 1. Пример date()

print(date( "l dS of F Y h:i:s A" ));
print("July 1, 2000 is on a " . date("l", mktime(0,0,0,7,1,2000)));

Функции date() и mktime() возможно использовать вместе для того, чтобы найти даты в будущем или прошлом.

Пример 2.Пример функций date() и mktime()

$tomorrow  = mktime(0,0,0,date("m")  ,date("d")+1,date("Y"));
$lastmonth = mktime(0,0,0,date("m")-1,date("d"),  date("Y"));
$nextyear  = mktime(0,0,0,date("m"),  date("d",   date("Y")+1);

Для того, чтобы отформатировать даты на других языках, Вы должны использовать функции setlocale() и strftime()

См.также gmdate() and mktime().

strftime

strftime -- форматирует локальное время согласно установкам locale

Описание

string strftime(string format, int timestamp);

Возвращает строку, отформатированную согласно данной форматной строке и используя данную временную метку или текущее локальное время, если метка не задана. Названия месяцев и недель и другие, зависящие от языка строки, зависят от текущего locale, устанавливающегося с помощью setlocale().

В форматной строке следует использовать следующие спецификаторы преобразований:

  • %a - сокращенное название дня недели согласно текущему locale

  • %A - полное название дня недели согласно текущему locale

  • %b - сокращенное название месяца согласно текущему locale

  • %B - полное название месяца согласно текущему locale

  • %c - предпочтительное представление даты и времени для текущего locale

  • %d - день месяца как десятичное число (в диапазоне от 0 до 31)

  • %H - час как десятичное число в 24-часовом формате (в диапазоне от 00 до 23)

  • %I - час как десятичное число в 12-часовом формате (в диапазоне от 01 до 12)

  • %j - день года как десятичное число (в диапазоне от 001 до 366)

  • %m - месяц как десятичное число (в диапазоне от 1 до 12)

  • %M - минуты как десятичное число

  • %p - `am' или `pm' согласно текущему времени, или соответствующие строки для текущего locale

  • %S - секунды как десятичное число

  • %U - номер недели текущего года как десятичное число, начиная с первого Воскресенья в качестве первого дня первой недели

  • %W - номер недели текущего года как десятичное число, ночиная с первого Понедельника в качестве первого дня первой недели

  • %w - день недели как целое число, Воскресенье - 0-й день

  • %x - предпочитаемое представление даты для текущего locale не включающее время

  • %X - предпочитаемое представление времени для текущего locale не включающее дату

  • %y - год как десятичное число без столетия (в диапазоне от 00 до 99)

  • %Y - год как десятичное число, включая столетие

  • %Z - временная зона или название или сокращение

  • %% - символ `%'

Пример 1. Пример функции strftime()

setlocale ("LC_TIME", "C");
print(strftime("%A in Finnish is "));
setlocale ("LC_TIME", "fi");
print(strftime("%A, in French "));
setlocale ("LC_TIME", "fr");
print(strftime("%A and in German "));
setlocale ("LC_TIME", "de");
print(strftime("%A.\n"));
Пример будет работать, если у вас установлены соответствующие locale.

См.также setlocale() и mktime().

getdate

getdate -- получает информацию о дате/времени

Описание

array getdate(int timestamp);

Возвращает ассоциативный массив, содержащий информацию о дате со следующими элементами:

  • "seconds" - секунды

  • "minutes" - минуты

  • "hours" - часы

  • "mday" - день месяца

  • "wday" - день недели, цифровой

  • "mon" - месяц, цифровой

  • "year" - год, цифровой

  • "yday" - день года, цифровой; т.е. "299"

  • "weekday" - день недели, текстовый, полный; т.е. "Friday"

  • "month" - месяц, текстовый, полный; т.е. "January"

gmdate

gmdate -- форматирует GMT/CUT время/дату

Описание

string gmdate(string format, int timestamp);

Аналогична функции date() за исключением того, что время возвращается в Гринвичском формате Greenwich Mean Time (GMT). Например, при запуске в Финляндии (GMT +0200), первая строка ниже напечатает "Jan 01 1998 00:00:00", в то время как вторая строка напечатает "Dec 31 1997 22:00:00".

Пример 1. пример gmdate()

echo date( "M d Y H:i:s",mktime(0,0,0,1,1,1998) );
echo gmdate( "M d Y H:i:s",mktime(0,0,0,1,1,1998) );

См.также date(), mktime() и gmmktime().

mktime

mktime -- получает временную метку UNIX для даты

Описание

int mktime(int hour, int minute, int second, int month, int day, int year);

Предупреждение: Обратите внимание на необычный порядок аргументов, который отличается от порядка аргументов в вызове функции mktime() из UNIX, и который нехорошо ведет себя при неправильно заданных параметрах (см.ниже). Это очень часто встречающаяся ошибка в скриптах.

Возвращает временную метку Unix согласно данным аргументам. Эта временная метка является целым числом, равным количеству секунд между эпохой Unix (1 Января 1970) и указанным временем.

Аргументы могут быть опущены с права налево; каждый опущенный таким образом аргумент будет установлен в текущую величину согласно локальной дате и времени.

MkTime is useful for doing date arithmetic and validation, as it MkTime полезена при арифметических дейтсвиях с датой и ее проверкой, она будет автоматически вычислять корректную величину для вешедших за границы параметров. Например, каждая из следующих строк возвращает строку "Jan-01-1998".

Пример 1. Пример mktime()

echo date( "M-d-Y", mktime(0,0,0,12,32,1997) );
echo date( "M-d-Y", mktime(0,0,0,13,1,1997) );
echo date( "M-d-Y", mktime(0,0,0,1,1,1998) );

См.также date() и time().

gmmktime

gmmktime -- получает временную метку UNIX для даты в GMT

Описание

int gmmktime(int hour, int minute, int second, int month, int day, int year);

Идентична mktime() за исключением передаваемых параметров, представляющих дату в GMT.

time

time -- возвращает текущую временную метку UNIX

Описание

int time(void);

Возвращает текущее время, измеренное в числе секунд с эпохи Unix (1 Января 1970 00:00:00 GMT).

См.также date().

microtime

microtime -- возвращает текущую временную метку UNIX в микросекундах

Описание

string microtime(void);

Возвращает строку "msec sec" где sec текущее время, измеренное в числе секунд с эпохи Unix (0:00:00 1 Января, 1970 GMT), а msec - это часть в микросекундах. Эти функции доступны только в операционных системах, поддерживающих системный вызов gettimeofday().

См.также time().


IX. Функции для работы с каталогами

chdir

chdir -- смена каталога

Описание

int chdir(string directory);
Изменяет текущий PHP каталог на directory. Возвращает FALSE если не может изменить, TRUE если смена произошла.

dir

dir -- класс каталога (псевдо-объектно ориентированный механизм)

Описание

new dir(string directory);
Псевдо-объектно ориентированный механизм для чтения каталога. Открывает каталог из directory. Два реквезита доступно, если только каталог был открыт. Реквезит handle может быть использован вместе с другими функциями работы с каталогом типа readdir(), rewinddir() и closedir(). Реквезит path установлен путь каталога, который был открыт. Три метода доступны: чтение, возврат к началу и закрытие.
Пример 1. Dir() Пример
$d = dir("/etc");
echo "Handle: ".$d->handle."<br>\n";
echo "Path: ".$d->path."<br>\n";
while($entry=$d->read()) {
    echo $entry."<br>\n";
}
$d->close();

closedir

closedir -- закрыть дескриптор(handle) каталога

Описание

void closedir(int dir_handle);
Закрывает поток каталога, обозначенный как dir_handle. Поток предварительно должен быть открыт финкцией opendir().

opendir

opendir -- открыть дескриптор(handle) каталога

Описание

int opendir(string path);
Возвращает дескриптор(handle) каталога, который в последующем используется в closedir(), readdir(), и rewinddir() обращениях.

readdir

readdir -- чтение данных из каталога по дескриптору(handle)

Описание

string readdir(int dir_handle);
Возвращает имя следующего файла из каталога. Имена не возвращаются в любом специфическом порядке.
Пример 1. Вывод всех файлов в текущем каталоге
<?php
    $handle=opendir('.');
    echo "Directory handle: $handle\n";
    echo "Files:\n";
    while ($file = readdir($handle)) {
        echo "$file\n";
    }
    closedir($handle);
?>

rewinddir

rewinddir -- возврат к началу данных каталога по дескриптору(handle)

Описание

void rewinddir(int dir_handle);
Сбрасывает поток каталога, обозначенный как dir_handle в начало данных.


X. Функции динамической загрузки

dl

dl -- загрузка PHP расширений во время выполнения

Описание

int dl(string library);
Загружает PHP расширение определенное в library. Смотри также extension_dir директиву конфигурации.


XI. Функции запуска программ

escapeshellcmd

escapeshellcmd -- убирает shell метасимволы

Описание

string escapeshellcmd(string command);
EscapeShellCmd() убирает любые символы в строке, которые могут быть использованы в командном интерпретаторе как произвольные команды. Эту функцию нужно использовать, что бы убедится, что все ваши данные введены правильно, и эту функцию лучше всего вставлять в функции exec() или system(). Стандартное использование этой функции выглядит так:
system(EscapeShellCmd($cmd))

exec

exec -- Запуск внешней программы

Описание

string exec(string command, string [array], int [return_var]);
exec() запускает программу из строки command, весь стандартный вывод отключен. Возвращает последнюю строку результата выполнения программы. Если вы хотите запустить команду и использовать все данные непосредственно без всякого вмешательства других программ, то используйте функцию PassThru().

Если параметр array установлен, то указанный массив будет заполнен выводом из программы. Помните, если массив уже содержит данные, то exec() добавляет свои данные. Если вы не хотите, что бы функция добавляла данные, вызывайте unset() для массива перед использованием exec().

Если параметр return_var установлен наряду с параметром array, то в него записывается результат выполнения команды.

Обратите внимание, что если ваша функция будет использовать данные из ввода пользователей, то надо использовать EscapeShellCmd() для того, что бы пользователи не смогли запустить произвольные программы.

См. также system(), PassThru(),
popen()
и EscapeShellCmd().

system

system -- Запуск внешней программы с выводом результата

Описание

string system(string command, int [return_var]);
System() такая же, как и C версия этой функции для запуска command и вывода результата. Если используется второй параметр, то в него записывается результат выполнения команды.

Обратите внимание, что если ваша функция будет использовать данные из ввода пользователей, то надо использовать EscapeShellCmd() для того, что бы пользователи не смогли запустить произвольные программы.

Вызов System() также пробует автоматически вставить в буфер вывода web сервера после каждой строки вывода, если PHP запущен как модель сервера.

Если вы хотите запустить команду и использовать все данные непосредственно без всякого вмешательства других программ, то используйте функцию PassThru(). См. также exec() и popen() функции.

passthru

passthru -- Запускает внешнюю программу и выводит данные напрямую

Описание

string passthru(string command, int [return_var]);
Функция passthru() похожа на функцию Exec() для запуска command. Если параметр return_var установлен, то результат Unix команды помещается здесь. Эта функция должна использоваться вместо Exec() или System() тогда, когда вывод из Unix команды является двоичными данными, которые должны быть переданы непосредственно обратно в окно просмотра(browser). Это можно использовать, например, для запуска утилиты pbmplus для вывода непосредственно потока изображения. Установка типа image/gif и вызов программы pbmplus, чтобы вывести gif-рисунок, вы можете создавать PHP скрипты, которые выводят изображения непосредственно.

См. также exec() и fpassthru().


XVII. Функции IMAP

Для того, чтобы эти функции заработали вц должны скомпилировать PHP с флагом --with-imap. Этот флаг требут, чтобы была установлена библиотека c-client. Последнюю версию можно получить по адресу ftp://ftp.cac.washington.edu/imap/. Затем скопируйте c-client/c-client.a в /usr/local/lib или какую либо другую директорию, прописанную в пути, затем скопируйте c-client/rfc822.h, mail.h и linkage.h в /usr/local/include или другую директорию с include-файлами.

imap_append

imap_append -- Добавляет текстовое сообщение в указанный почтовый ящик

Описание

int imap_append(int imap_stream, string mbox, string message, stringflags);

Возвращает true в случае успеха или false иначе.

imap_append() добавляет текстовое сообщение в указанный почтовый ящик mbox. Если указаны необязательные флаги, также записывает в почтовый ящик и флаги.

При общении с сервером Cyrus IMAP нужно использовать в качестве ограничителей строки "\r\n" вместо "\n", иначе действие не выполнится.

imap_base64

imap_base64 -- Декодирует текст, закодированный с помощью BASE64

Описание

string imap_base64(string text);

Функция imap_base64() декодирует текст в формате BASE-64. Декодированное сообщение возвращается как строка.

imap_body

imap_body -- Читает тело сообщения

Описание

string imap_body(int imap_stream, int msg_number, int flags);

Функция imap_body() возвращает тело сообщения, имеющего номер п/п msg_number в текущем почтовом ящике. Необязательные флаги это битовые маски из

FT_UID - Номер сообщения msgno является UID'ом сообщения

FT_PEEK - Не устанавливать флаг \Seen если он еще не установлен.

FT_INTERNAL - Возвращаемая строка записана во внутреннем формате и не может быть приведена к канонической форме с CRLF.

imap_check

imap_check -- Проверяет текущий почтовый ящик

Описание

array imap_check(int imap_stream);

Возвращает информацию о текущем почтовом ящике. В случае неуспеха возвращает FALSE.

Функция imap_check() проверяет статус текущего почтового ящика на сервере и возвращает информацию в объекте со следующими свойствами.

Date : дата сообщения
Driver : драйвер
Mailbox : название почтового ящика
Nmsgs : количество сообщений
Recent : количество недавно пришедших сообщений

imap_close

imap_close -- Закрывает поток IMAP

Описание

int imap_close(int imap_stream, int flags);

Закрывает поток imap. Необязательный флаг CL_EXPUNGE заставляет стереть помеченные на удаление сообщения при закрытии.

imap_createmailbox

imap_createmailbox -- Создает новый почтовый ящик.

Описание

int imap_createmailbox(int imap_stream, string mbox);

imap_createmailbox() создает новый почтовый ящик указанный в mbox.

Возвращает true в случае успеха и false при ошибке.

imap_delete

imap_delete -- Помечает сообщение из текущего почтового ящика на удаление

Описание

int imap_delete(int imap_stream, int msg_number);

Возвращает true.

Функция imap_delete() помечает сообщение, указанное через msg_number на удаление. Настоящее удаление сообщений осуществляется функцией imap_expunge().

imap_deletemailbox

imap_deletemailbox -- Удаляет почтовый ящик

Описание

int imap_deletemailbox(int imap_stream, string mbox);

imap_deletemailbox() удаляет указанный почтовый ящик.

Возвращает true в случае успеха и false иначе.

imap_expunge

imap_expunge -- Удаляет все сообщения, помеченные на удаление

Описание

int imap_expunge(int imap_stream);

imap_expunge() удаляет все сообщения помеченные на удаление с помощью imap_delete().

Возвращает true.

imap_fetchbody

imap_fetchbody -- Извлекает простую секцию тела сообщения

Описание

string imap_fetchbody(int imap_stream, int msg_number, int part_number, flags flags);

Эта функция заставляет извлечь подробную секцию указанного сообщения как текстовую строку. Секция это строка целых чисел, разделенных точками, которые указывают на части тела сообщения в списке частей согласно спецификации IMAP4. Части тела не декодируются этой функцией.

Необязательным параметром к imap_fetchbody () является битовая маска из

FT_UID - msgono является UID'ом

FT_PEEK - не устанавливать флаг \Seen если он не установлен

FT_UID - возвращаемая строка записана во внутреннем формате, которое не может быть канонизированна с помощью CRLF

imap_fetchstructure

imap_fetchstructure -- Читает структуру простого сообщения

Описание

array imap_fetchstructure(int imap_stream, int msg_number);

Эта функция заставляет извлечь всю информацию о структуре сообщения с номером msg_number. Возвращаемая величина является объектом со следующими элементами.

type, encoding, ifsubtype, subtype, ifdescription, description, ifid, id, lines, bytes, ifparameters (тип, кодировка, подтип интерфейса, подтип, описание интерфейса, описание, идентификатор интерфейса, строки, байты, параметры интерфейса)

Также функция возвращает массив объектов под названием parameters[]. Этот объект имеет следующие свойства.

attribute, value
атрибут, величина

В случае сообщения из нескольих частей, функция также возвращает массив объектов всех свойств под название parts[].

imap_header

imap_header -- Читает заголовок сообщения

Описание

object imap_header(int imap_stream, int msg_number, int fromlength, int subjectlength, int defaulthost);

Эта функция возвращает объект различных элементов заголовка

       remail,date,Date,subject,Subject,in_reply_to,message_id,newsgroups,
       followup_to,references

toaddress (полная строка To: строка длиной до 1024 символов)

to[] (возвращает массив объектов из строки To, содержит:)
   personal
   adl
   mailbox
   host

fromaddress (полная строка From: строка длиной до 1024 символов)

from[] (возвращает массив объектов из строки From, содержит:)
   personal
   adl
   mailbox
   host

ccaddress (полная строка  Cc: строка длиной до 1024 символов)
cc[] (возвращает массив объектов из строки Cc, содержит:)
   personal
   adl
   mailbox
   host

bccaddress (полная строка Bcc: строка длиной до 1024 символов)
bcc[] (возвращает массив объектов из строки Bcc, содержит:)
   personal
   adl
   mailbox
   host

reply_toaddress (полная строка Reply_to: строка длиной до 1024 символов)
reply_to[] (возвращает массив объектов из строки Reply_to, содержит:)
   personal
   adl
   mailbox
   host

senderaddress (полная строка Sender: строка длиной до 1024 символов)
sender[] (возвращает массив объектов из строки Sender, содержит:)
   personal
   adl
   mailbox
   host

return_path (полная строка Return-path: строка длиной до 1024 символов)
return_path[] (возвращает массив объектов из строки Return_path, содержит:)
   personal
   adl
   mailbox
   host

udate ( дата сообщения в формате времени unix)

fetchfrom (строка From, отформатированная до fromlength символов)
fetchsubject (строка Subject, отформатированная до subjectlength символов)

imap_headers

imap_headers -- Возвращает заголовки всех сообщений в почтовом ящике

Описание

array imap_headers(int imap_stream);

Возвращает строковый массив из информации по заголокам. Один элемент массива на сообщение.

imap_listmailbox

imap_listmailbox -- Читает список почтовых ящиков

Описание

array imap_listmailbox(int imap_stream, string ref, string pat);

Возвращает массив, содержащий названия почтовых ящиков.

imap_listsubscribed

imap_listsubscribed -- Перечисляет все подписанные ящики

Описание

array imap_listsubscribed(int imap_stream, string ref, string pattern);

Возвращает массив всех почтовых ящиков на которые Вы подписаны. Аргументы ref и pattern указывают начальное месторасположение откуда начинать поиск и шаблон, которому должны удовлетворять названия почтовых ящиков.

imap_mail_copy

imap_mail_copy -- Копирует указанные сообщения в почтовый ящик

Описание

int imap_mail_copy(int imap_stream, string msglist, string mbox, int flags);

Возвращает true в случае успеха и false иначе.

Копирует почтовые сообщения указанные с помощью msglist в почтовый ящик mbox. msglist - это диапазон, а не просто номера сообщений.

флаги - это битовые маски из

     CP_UID - номера в последовательности содержат UID'ы

     CP_MOVE - после копирования удалить сообщения из текущего почтового ящика

imap_mail_move

imap_mail_move -- Переносит указанные сообщения в почтовый ящик

Описание

int imap_mail_move(int imap_stream, string msglist, string mbox);

Переносит почтовые сообщения указанные с помощью msglist в почтовый ящик mbox. msglist - это диапазон, а не просто номера сообщений.

Возвращает true в случае успеха и false иначе.

imap_num_msg

imap_num_msg -- Выдает количество сообщений в текущем почтовом ящике

Описание

int imap_num_msg(void);

Возвращает количество сообщений в текущем почтовом ящике.

imap_num_recent

imap_num_recent -- Возвращает количество недавно пришедших сообщений в текущем почтовом ящике

Описание

int imap_num_recent(int imap_stream);

Возвращает количество недавно пришедших сообщений в текущем почтовом ящике.

imap_open

imap_open -- Открывает поток IMAP в почтовый ящик

Описание

int imap_open(string mailbox, string username, string password, int flags);

В случае успеха возвращает поток IMAP или false иначе. Эта функция может быть использована для открытия потоков к POP3 и NNTP серверам. Для того, чтобы присоединиться к серверу IMAP на 143-й порт на локальной машине сделайте следующее:

$mbox = imap_open("{localhost:143}INBOX","user_id","password");

Для того, чтобы подсоединиться к POP3-серверу на 110-й порт на локальном сервере используйте:

$mbox = imap_open("{localhost/pop3:110}INBOX","user_id","password");

Для того, чтобы подсоединиться к NNTP-серверу на 119-й порт на локальном сервере используйте:

$nntp = imap_open("{localhost/nntp:119}comp.test","","");

Для того, чтобы подсоединиться к удаленному серверу замените "localhost" на имя или IP-адрес сервера к которому Вы хотите подсоединиться.

Опции - битовая маска из

     OP_READONLY - Открыть почтовый ящик в режим "только чтение"

     OP_ANONYMOUS - Не использовать или не обновлять .newsrc при использовании новостей

     OP_HALFOPEN - Для IMAP и NNTP устанавливает соединение, но не открывает почтовый ящик

     CL_EXPUNGE - Автоматически очищать почтовый ящик при закрытии

imap_ping

imap_ping -- Проверяет поток IMAP на работоспособность

Описание

int imap_ping(int imap_stream);

Возвращает true если поток еще работоспособен и false иначе.

Функция imap_ping() проверяет поток на работоспособность. Он может также проверять новую почту; это предпочтительный метод для периодической проверки новой почты и "живучести" удаленных серверов.

imap_renamemailbox

imap_renamemailbox -- Переименовывает старый почтовый ящик в новый

Описание

int imap_renamemailbox(int imap_stream, string old_mbox, string new_mbox);

Эта функция переименовывает старый почтовый ящик в новый.

Возвращает true в случае успеха и false иначе.

imap_reopen

imap_reopen -- Заново открывает поток IMAP на новый почтовый ящик

Описание

int imap_reopen(string imap_stream, string mailbox, string [flags]);

Возвращает true в случае успеха и false иначе.

Эта функция заново открывает указанный поток на новый ящик.

Опции - битовая маска из

     OP_READONLY - Открыть почтовый ящик в режиме только чтение

     OP_ANONYMOUS - Не использовать или не обновлять .newsrc при работе с новостями

     OP_HALFOPEN - Для IMAP и NNTP устанавливает связь но не открывает почтовый ящик

     CL_EXPUNGE - Очищает почтовый ящик при закрытии

imap_subscribe

imap_subscribe -- Подписывает на почтовый ящик

Описание

int imap_subscribe(int imap_stream, string mbox);

Подписывает на новый почтовый ящик.

Возвращает true в случае успеха и false иначе.

imap_undelete

imap_undelete -- Снимает отметку с сообщения помеченного на удаление

Описание

int imap_undelete(int imap_stream, int msg_number);

Эта функция cнимает отметку с сообщения помеченного на удаление функцией imap_delete().

Возвращает true в случае успеха и false иначе.

imap_unsubscribe

imap_unsubscribe -- Снимает подписку с почтового ящика

Описание

int imap_unsubscribe(int imap_stream, string mbox);

Снимает подписку с почтового ящика.

Возвращает true в случае успеха и false иначе.

imap_qprint

imap_qprint -- Конвертирует строку формата quoted-printable в 8-битовую строку

Описание

string imap_qprint(string string);

Конвертирует строку формата quoted-printable в 8-битовую строку.

Возвращает 8-битовую (бинарную) строку

imap_8bit

imap_8bit -- Конвертирует 8-битовую строку в формат quoted-printable

Описание

string imap_8bit(string string);

Конвертирует 8-битовую строку в формат quoted-printable.

Возвращает строку в формате quoted-printable.

imap_binary

imap_binary -- Конвертирует 8-битную строку в формат base64

Описание

string imap_binary(string string);

Конвертирует 8-битную строку в формат base64.

Возвращает строку в формате base64.

imap_scanmailbox

imap_scanmailbox -- Читает список почтовых ящиков, проводит поиск в названиях ящиков

Описание

array imap_scanmailbox(int imap_stream, string string);

Возвращает массив, содержащий имена почтовых ящиков, которые имеют строку string в названии.

imap_mailboxmsginfo

imap_mailboxmsginfo -- Получает информацию о текущем почтовом ящике

Описание

array imap_mailboxmsginfo(int imap_stream);

Возвращает информацию о текущем почтовом ящике. FALSE в случае неудачи.

Функция imap_mailboxmsginfo() проверяет статус текущего почтового ящика на сервере и возвращает информацию в объекте со следующими свойствами:

       Date : дата сообщения
       Driver : драйвер
       Mailbox : название почтового ящика
       Nmsgs : количество сообщений
       Recent : количество недавно пришедших сообщений
       Unread : количество непрочитанных сообщений
       Size : размер почтового ящика

imap_rfc822_write_address

imap_rfc822_write_address -- Возвращает правильно отформатированный email адрес

Description

string imap_rfc822_write_address(string mailbox, string host, string personal);

Возвращает правильно отформатированный email адрес по данному почтовому ящику, хосту и персональной информации.

imap_rfc822_parse_adrlist

imap_rfc822_parse_adrlist -- Проводит разбор адресной строки

Описание

string imap_rfc822_parse_adrlist(string address, string default_host);

Эта функция разбирает адресную строку и для каждого адреса возвращает массив объектов. Есть 4 типа объектов:

     mailbox - название почтового ящика (имя пользователя)
     host   - название хоста
     personal - личное имя
     adl - путь к домену-источнику

imap_setflag_full

imap_setflag_full -- Устанавливает флаги на сообщения

Описание

string imap_setflag_full(int stream, string sequence, string flag, string options);

Эта функция застваляет добавить указанный флаг к набору флагов сообщения в указанной последовательности.

options - это битовая маска из

ST_UID Аргументы последовательности содержат UIDы вместо номеров

imap_clearflag_full

imap_clearflag_full -- Очищает флаги сообщения

Описание

string imap_clearflag_full(int stream, string sequence, string flag, string options);

Эта функция заставляет удалить флаги из набора флагов сообщения в указанной последовательности.

options - это битовая маска из

ST_UID Аргументы последовательности содержат UIDы вместо номеров

imap_sort

imap_sort -- Сортирует сообщения в текущем почтовом ящике

Описание

string imap_sort(int stream, int criteria, int reverse, int options);

Возвращает массив номеров сообщений рассортированных по данному параметру Rev должен быть равен 1 если нужна сортировка в обратном порядке

Критерии сортировки (должен быть указан только один):

                SORTDATE        по дате сообщения
                SORTARRIVAL     по дате поступления
                SORTFROM        по полю From
                SORTSUBJECT     по теме сообщения
                SORTTO          по полю To
                SORTCC          по полю cc
                SORTSIZE        по размеру

опции - битовая маска из

        SE_UID          Возвратить UIDы вместо номеров последовательности
        SE_NOPREFETCH   Не извелекать заранее найденные сообщения

imap_fetchheader

imap_fetchheader -- Возвращает заголовок сообщения

Описание

stringimap_fetchheader(int imap_stream, int msgno, int flags);

Эта функция заставляет извлечь полный, неотфильтрованный заголовок указанного сообщения в формате RFC 822 как текстовую строку. Опции:

        FT_UID          msgno является UID'ом
        FT_INTERNAL     Возвращаемая строка записана во внутреннем формате
                        без каких-либо попыток канонизировать ее с помощью CRLF
        FT_PREFETCHTEXT RFC822. Текст должен быть предварительно разобран.
                        Это поможет избежать эстренных задержек если требуется
                        извлечь полный текст сообщения (например, в операции
                        "сохранить в локальном файле")

imap_uid

imap_uid -- Эта функция возвращает UID по данному номеру сообщения в последовательности

Описание

string imap_uid(string mailbox, int msgno);

Эта функция возвращает UID по данному номеру сообщения в последовательности.


XII. Почтовые функции

mail

mail -- шлет почту

Описание

bool mail(string to, string subject, string message, string
additional_headers);

Mail() автоматически посылает сообщение, содержащееся в message адресату, указанному в to. Несколько получателей могут быть указаны в поле to в виде строки с адресами, разделенными пробелами.

Пример 1. Посылка почты.

mail("rasmus@lerdorf.on.ca", "Моя тема", "Строка 1\nСтрока 2\nСтрока 3");

Если задан четвертый строковый аргумент, он автоматически вставляется в конец заголовка. обычно это используется при добавлении дополнительных полей в заголовок. Несколько дополнительных полей разделяются символом новой строки.

Пример 2. Посылка почты с дополнительными полями заголовка.

mail("ssb@guardian.no", "the subject", $message,
"From: webmaster@$SERVER_NAME\nReply-To: webmaster@$SERVER_NAME\nX-Mailer: PHP/" . phpversion());


XXIV. Дополнительные функции

Эти функции были размещены здесь, т.к. не подходят не под какую либо категорию.

eval

eval -- Производит выполнение строки содержащей PHP код

Описание

void eval(string code_str);
eval() производит выполнение строки, данной в code_str содержащей PHP код. Кстати, это может пригодиться для сохранения кода в текстовом поле базы данных для более позднего выполнения.

Имеются некоторые условия, которые надо иметь в виду при использовании eval(). Не забудьте, что переданная строка должна иметь допустимый PHP код, при включении чего-нибудь подобного завершению кода с точкой с запятой дальнейшее выполнение не прервется на строке после eval(), поэтому пропускайте это в code_str.

Также не забудьте, что при изменении переменных значений в eval() эти переменные будут изменены и в основных данных.
Пример 1. eval() - простое объединение текста
<?php
$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.<br>';
echo $str;
eval( "\$str = \"$str\";" );
echo $str;
?>

При выполнении вышеприведенного примера будет выведено следующее:

This is a $string with my $name in it.
This is a cup with my coffee in it.

die

die -- Вывод сообщения и завершение текущего скрипта

Описание

void die(string message);
Эта функция выводит сообщение и прекращает выполнение текущего скрипта. Не возвращает значение.
Пример 1. die
<?php
$filename = '/path/to/data-file';
$file = fopen($filename, 'r')
  or die "unable to open file ($filename)";
?>

exit

exit -- Завершает текущий скрипт

Описание

void exit(void);
Эта функция завершает текущий скрипт. Не возвращает значение.

iptcparse

iptcparse -- Анализирует двоичный IPTC http://www.xe.net/iptc/ блок на одиночные тэги.

Описание

array iptcparse(string iptcblock);
Эта функция анализирует двоичный блок IPTC на одиночные теги. Возвращает массив, использующий tagmarker как индекс и значение как значение. Возвращает false при ошибке или если никаких IPTC данных не было найдено. См. GetImageSize() для примера.

leak

leak -- Отсечение куска памяти

Описание

void leak(int bytes);
Leak() отсекает определенный объем памяти.

Это полезно при отладке диспетчера памяти, который автоматически очищает "отсеченную" память при выполнении запроса.

pack

pack -- упаковывает данные в двоичную строку

Описание

string pack(string format, mixed [args]...);
Упаковывает данные в двоичную строку согласно формату. Возвращает двоичную строку, содержащую данные.

Идея на эту функцию принималась из Perl и всей работы кодов форматирования также как там. Строка формата состоит из кодов формата, сопровождаемые факультативным параметром ретранслятора. Параметр ретранслятора может быть или целочисленное значение или * для повторение до конца входных данных. Для a, A, h, H количество повторов определяет, сколько принимается символов одного параметра данных, для @ это безусловная позиция, где поместить следующие данные, для всего остального количество повторов определяет сколько данных будет использовано и упаковано в возникающую в результате двоичную строку. В настоящее время выполнено:

    a строка NUL-заполнений

    A строка SPACE-заполнений

    h Hex строка, младший полубайт вначале

    H Hex строка, старший полубайт вначале

    c signed char

    C unsigned char

    s signed short (всегда 16 бит, machine byte order)

    S unsigned short (всегда 16 бит, machine byte order)

    n unsigned short (всегда 16 бит, big endian byte order)

    v unsigned short (всегда 16 бит, little endian byte order)

    i signed integer (machine dependant размер и byte order)

    I unsigned integer (machine dependant размер и byte order)

    l signed long (всегда 32 бит, machine byte order)

    L unsigned long (всегда 32 бит, machine byte order)

    N unsigned long (всегда 32 бит, big endian byte order)

    V unsigned long (всегда 32 бит, little endian byte order)

    f float (machine dependent размер и representation)

    d double (machine dependent размер и representation)

    x NUL байт

    X Копирует один байт

    @ NUL-Заполнение до конкретной позиции

Пример 1. pack форматируем строку
$binarydata = pack(" nvc* ", 0x1234, 0x5678, 65, 66);
Возникающая в результате двоичная строка будет длиной 6 байтов и содержать последовательность байтов 0x12, 0x34, 0x78, 0x56, 0x41, 0x42.

Обратите внимание, что различие между знаковыми и без знаковыми значениями эффективно только для функции unpack(), так как функция pack() дает тот же самый результат для знаковых и без знаковых кодов форматирования.

Также обратите внимание, что PHP хранит интегральные значения как значения со знаком и имеет machine dependant размер. Если вы делаете без знака, то интегральное значение будет сохранено и сконвертировано, при этом конечный результат будет неизвестен.

register_shutdown_function

register_shutdown_function -- Устанавливает функцию, которая будет выполнена при завершении.

Описание

int register_shutdown_function(string func);
Устанавливает функцию с именем func, которая будет выполнена при завершении.

serialize

serialize -- Генерирует удобохраниемое представление значения

Описание

string serialize(mixed value);
serialize() возвращает строку состоящую из потока байтов при представлениизначения value, которое может где-нибудь сохранено.

Это полезно для сохранения или передачи значений PHP без потери их типа и структуры..

Чтобы преобразовать строку обратно в PHP значение, используйте unserialize(). serialize() обрабатывает следующие типы: integer, double, string, array (многомерный) и object (объект будет преобразован в последовательную форму, но методы при этом будут утеряны).
Пример 1. serialize
// $session_data содержит многомерный массив с информацией о сессии
// текущего пользователя.  Мы используем serialize() для сохранения
// этого в базе данных в конце запроса.

$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn,
                     "UPDATE sessions SET data = ? WHERE id = ?");
$sqldata = array(serialize($session_data), $PHP_AUTH_USER);
if (!odbc_execute($stmt, &$sqldata)) {
    $stmt = odbc_prepare($conn,
                         "INSERT INTO sessions (id, data) VALUES(?, ?)");
    if (!odbc_execute($stmt, &$sqldata)) {
        /* Что-то сделано неправильно. */
    }
}

sleep

sleep -- Задержка выполнения

Описание

void sleep(int seconds);
Sleep фукция выполняет задержку выполненя программы в секундах (seconds).

См. также usleep().

unpack

unpack -- Распаковывает данные из двоичной строки

Описание

array unpack(string format, string data);
Распаковывает данные из двоичной строки в массив согласно формату. Возвращает массив, содержащий распакованные элементы.

Unpack работает не так как в Perl поскольку распакованные данные сохранены в ассоциативном массиве. Чтобы сделать это, Вы должны установить различные коды формата, и отделить их наклонной чертой вправо /.
Пример 1. Распаковываем строку
$array = unpack("c2chars/nint", $binarydata);
Возникающий в результате массив будет содержать "chars1", "chars2" и "int".

Для объяснения кодов формата см. также: pack()

Помните, что PHP хранит интегральные значения со знаком. Даже если вы сохраните с указанием что это без знака, и будете извлекать, то все равно непредсказуем результат и может возникнуть ошибка.

unserialize

unserialize -- создает PHP значение из сохраненного представления

Описание

mixed unserialize(string str);
unserialize() берет одно сохраненное значение (см. serialize()) и преобразует обратно в PHP значение. Возвращает преобразованное значение, и может иметь тип: integer, double, string, array или object. Если был преобразован object, то методы не востановятся.
Пример 1. unserialize
// Здесь мы используем unserialize() для загрузки данных о сессии из базы данных
// в $session_data.  Этот пример дополняет описанный в месте
// с serialize().

$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn, "SELECT data FROM sessions WHERE id = ?");
$sqldata = array($PHP_AUTH_USER);
if (!odbc_execute($stmt, &$sqldata) || !odbc_fetch_into($stmt, &$tmp)) {
    // Если сбой запуска или выборки , то инициализируем массив
    $session_data = array();
} else {
    // Мы должны иметь представление в $tmp[0].
    $session_data = unserialize($tmp[0]);
    if (!is_array($session_data)) {
        // Что-то неправильно, инициализируем массив
        $session_data = array();
    }
}

uniqid

uniqid -- генерирует уникальный идентификатор

Описание

int uniqid(string prefix);
uniqid() возвращает уникальный идентификатор, основанный на текущем времени в микросекундах. Префикс может быть полезен, например, если Вы генерируете идентификаторы одновременно на отдельных хостах, которые, могли бы случилось, генерировали идентификатор в одной и той же микросекунде. Префикс может быть длиной до 114 символов.

Если Вы нуждаетесь в уникальном идентификаторе или лексеме(маркере), и Вы предполагаете раздавать эту лексему(маркер) пользователю через сеть (то есть сеанс cookies), то рекомендуется, чтобы Вы использовали что - нибудь со строками

$token = md5(uniqid("")); // Не произвольно
$better_token = md5(uniqid(random())); // Намного лучше, труднее подобрать
Это создаст 32 символьный идентификатор (128 бит hex число) который чрезвычайно трудно предсказать.

usleep

usleep -- Задержка выполнения в микросекундах

Описание

void usleep(int micro_seconds);
Задержка выполнения программы в микросекундах(micro_seconds).

См. также sleep().


XXXVI. Функции SNMP

Для использование функций SNMP в системе UNIX вам необходимо установить набор ucd-snmp. Ссылка на последнюю версию есть в PHP FAQ. В системе Windows эти функции доступны только в NT и не доступны в Win95/98.

snmpget

snmpget -- получает объект SNMP

Описание

int snmpget(string hostname, string community, string object_id);

Возвращает значание SNMP объекта при успехе и false при ошибке.

Функция snmpget() используется для чтения значения SNMP объекта, указанного в object_id. SNMP агент определяется именем хоста hostname и группа чтения определяется параметром community.

snmpget("127.0.0.1", "public", "system.SysContact.0")

snmpwalk

snmpwalk -- Получает все SNMP объекты у агента

Описание

array snmpwalk(string hostname, string community, string object_id);

Возвращает массив значений SNMP объектов начиная с object_id и false при ошибке.

Функция snmpwalk() используется для чтения всех значений у SNMP агента, определяемого параметром hostname. Community определяет группу чтения для агента. Нулевой object_id берется как корень дерева SNMP объектов и все объекты под этим деревом возвращаются как массив. Если object_id указан, то возвращаются все SNMP объекты ниже этого объекта.

$a = snmpwalk("127.0.0.1", "public", "");

Указанный выше вызов функции вернет все SNMP объекты из SNMP агента, напущенного на локальном хосте. По всем значениям можно пройти с помощью цикла

for($i=0; $i<count($a); $i++) {
    echo $a[$i];
}


XXXVIII. Функции URL

parse_url

parse_url -- обрабатывает URL и возвращает его компоненты

Описание

array parse_url(string url);

Эта функция возвращает ассоциативный массив, включающий множество различных существующих компонентов URL. Они включают "scheme", "host", "port", "user", "pass", "path", "query" и "fragment".

urldecode

urldecode -- декодирует URL-закодированную строку

Описание

string urldecode(string str);

Декодирует любые %## закодированные в указанной строке. Возвращается декодированная строка.

Пример 1. пример urldecode()

$a = split ('&', $querystring);
$i = 0;
while ($i < count ($a)) {
  $b = split ('=', $a [$i]);
  echo 'Value for parameter ', htmlspecialchars (urldecode ($b [0])),
       ' is ', htmlspecialchars (urldecode ($b [1])), "<BR>";
  $i++;
}

См. также urlencode()

urlencode

urlencode -- кодирует URL строку

Описание

string urlencode(string str);

возвращает строку, в которой все не не буквенноцифровые символы кроме -_. заменены на символ (%) с следующими за ним двумя шестнадцатиричными цифрами и пробелами, закодированными как символ (+) . Это кодирование то же самое, что и кодирование данных, полученных методом POST из WWW формы, это тот же тип, что и тип данных application/x-www-form-urlencoded . Это отличается от RFC1738 кодирование (см. rawurlencode() ) в котором исторически сложилось, что пробелы кодируются символами (+). Эта функция удобна, когда кодируемая строка должна быть использована в части запроса URL, как удобный путь передавать переменные на следующую страницу:

Пример 1. пример urlencode()

echo '<A HREF="mycgi?foo=', urlencode ($userinput), '">';

См. также urldecode()

base64_encode

base64_encode -- кодирует данные в кодировке MIME base64

Описание

string base64_encode(string data);

base64_encode() возвращает data закодированные в кодировке base64. Эта кодировка разработана для того, чтобы передовать двоичные данные через транспортные слои, которые не содержатвосьмой бит, такие как почтовые тела.

Данные в кодировке Base64 занимают примерно на 33% больше места, чем оригинал.

См. также: base64_decode(), RFC-2045 раздел 6.8.

base64_decode

base64_decode -- декодирует данные, закодированные в кодировке MIME base64

Описание

string base64_decode(string encoded_data);

base64_decode() декодирует encoded_data и возвращает оригинал данных. Возвращаемые данные могут быть двоичными.

См. также: base64_encode(), RFC-2045 раздел 6.8.


XXXIX. Функции переменных

gettype

gettype -- Получает тип переменной.

Описание

string gettype(mixed var);

Возвращает тип переменной PHP var.

Возможные значения для возвращаемой строки:

  • "integer"

  • "double"

  • "string"

  • "array"

  • "object"

  • "unknown type"

См. также: settype().

intval

intval -- Возвращает целочисленное значение переменной.

Описание

int intval(mixed var, int [base]);

Возвращает целочисленное значение переменной var, использую указанное основание для перевода (по умолчанию 10).

var Может быть скалярного типа. Вы не можете использовать функцию intval() для массивов или объектов.

См. также: doubleval(),
strval(),
settype() и Подмена типов.

doubleval

doubleval -- Получает значение переменной в формате double.

Описание

double doubleval(mixed var);

Возвращает double (с плавающей точкой) значение переменной var.

var может быть скалярного типа. Вы не можете использовать doubleval() на массивах и объектах.

См. также: intval(),
strval(),
settype() и Подмена типов.

empty

empty -- определяет, присвоено ли у переменной какое либо значение

Описание

int empty(mixed var);

Возвращает false, если var существует и имеет не пустое или не нулевое значение; true в обратном случае.

См. также: isset() и unset().

is_array

is_array -- Определяет, входит ли переменная в массив.

Описание

int is_array(mixed var);

Возвращает true, если var есть в массиве, false в обратном случае.

См. также: is_double(),
is_float(),
is_int(),
is_integer(),
is_real(),
is_string(),
is_long(), and
is_object().

is_double

is_double -- Определяет, является ли переменная типа double.

Описание

int is_double(mixed var);

Возвращает true, если var является типа double, false в обратном случае.

См. также: is_array(),
is_float(),
is_int(),
is_integer(),
is_real(),
is_string(),
is_long(), and
is_object().

is_float

is_float -- Определяет, является ли переменная типа float.

Описание

int is_float(mixed var);

Эта функция является псевдонимом для функции is_double().

См. также: is_double(),
is_real(),
is_int(),
is_integer(),
is_string(),
is_object(),
is_array(), and
is_long().

is_int

is_int -- Определяет, является ли переменная типа integer.

Описание

int is_int(mixed var);

Эта функция является псевдонимом для функции is_long().

См. также: is_double(),
is_float(),
is_integer(),
is_string(),
is_real(),
is_object(),
is_array(), and
is_long().

is_integer

is_integer -- Определяет, является ли переменная типа integer.

Описание

int is_integer(mixed var);

Эта функция является псевдонимом для функции is_long().

См. также: is_double(),
is_float(),
is_int(),
is_string(),
is_real(),
is_object(),
is_array(), and
is_long().

is_long

is_long -- Определяет, является ли переменная типа integer.

Описание

int is_long(mixed var);

Возвращает true, если var является типа integer (long), false в обратном случае.

См. также: is_double(),
is_float(),
is_int(),
is_real(),
is_string(),
is_object(),
is_array(), and
is_integer().

is_object

is_object -- Определяет, является ли переменная типа object.

Описание

int is_object(mixed var);

Возвращает true, если var типа object, false в обратном случае.

См. также: is_long(),
is_int(),
is_integer(),
is_float(),
is_double(),
is_real(),
is_string(), and
is_array().

is_real

is_real -- Определяет, является ли переменная типа real.

Описание

int is_real(mixed var);

Эта функция является псевдонимом для функции is_double().

См. также: is_long(),
is_int(),
is_integer(),
is_float(),
is_double(),
is_object(),
is_string(), and
is_array().

is_string

is_string -- Определяет, является ли переменная типа string.

Описание

int is_string(mixed var);

Возвращает true, если var is a string, false в обратном случае.

См. также: is_long(),
is_int(),
is_integer(),
is_float(),
is_double(),
is_real(),
is_object(), and
is_array().

isset

isset -- Определяет, существует ли переменная

Описание

int isset(mixed var);

Возвращает true, если var существует; false в обратном случае.

Если переменная была удалена функцией unset(), она больше не будет определяться функцией isset().

$a = "test";
echo isset($a); // true
unset($a);
echo isset($a); // false

См. также: empty() и unset().

settype

settype -- Устанавливает тип переменной.

Описание

int settype(string var, string type);

Устанавливает тип переменнойvar на type.

Возможные значения type :

  • "integer"

  • "double"

  • "string"

  • "array"

  • "object"

Возвращает true, при успехе; false в обратном случае.

См. также: gettype().

strval

strval -- Получает строковое значение переменной.

Описание

string strval(mixed var);

Получает строковое значение var.

var может быть любого скалярного типа. Вы не можете использовать strval() на массивах или объектах.

См. также: doubleval(),
intval(),
settype() и Подмена типов.

unset

unset -- Удаляет указанную переменную

Описание

int unset(mixed var);

unset() уничтожает указанную переменную и возвращает true.

Пример 1. unset() пример

unset( $foo );
unset( $bar['quux'] );

См. также: isset() и empty().


XL. Функции Vmailmgr

Эти функции требуют пакетов QMAIL (www.qmail.org) и vmailmgr Bruce Guenter http://www.qcc.sk.ca/~bguenter/distrib/vmailmgr/

Для всех функций следующие две переменные определяются как: строка vdomain - имя домена вашего виртуального домена (vdomain.com) , строка basepwd - пароль для 'real' пользователя, который поддерживает виртуальных пользователей.

Только до 8 символов распознаются в пароле для виртуальных пользователей

Возвращается статус для всех функциональных значений ответа в response.h

O ok
1 плохой
2 ошибка
3 ошибка соединения

Известные проблемы: vm_deluser() не удаляет директорию пользователя, хотя должена это делать. vm_addalias() в настоящее время не работает правильно.

<?php
dl("php3_vmailmgr.so"); //load the shared library
$vdomain="vdomain.com";
$basepwd="password";
?>

vm_adduser

vm_adduser -- Добавляет нового виртуального пользователя с паролем

Описание

int vm_adduser(string vdomain, string basepwd, string newusername, string newuserpassword);

Добавляет нового виртуального пользователя с паролем. newusername - это имя почтового login-а и newuserpassword - это пароль для это пользователя.

vm_addalias

vm_addalias -- Добавляет новый псевдоним для виртуального пользователя

Описание

int vm_addalias(string vdomain, string basepwd, string username, string alias);

Добавляет псевдоним виртуальному пользователю. username - это имя почтового login-а и alias - это псевдоним для этого пользователя.

vm_passwd

vm_passwd -- Изменяет пароль виртуальных пользователей

Описание

int vm_passwd(string vdomain, string username, string password, string newpassword);

Изменяет пароль виртуальных пользователей. username - это имя почтового login-а, password - старый пароль пользователя, и newpassword - новый пароль.

vm_delalias

vm_delalias -- Удаляет всевдоним

Описание

int vm_delalias(string vdomain, string basepwd, string alias);

Удаляет псевдоним.

vm_deluser

vm_deluser -- Удаляет псевдоним виртуального пользователя

Описание

int vm_deluser (string vdomain, string username);

Удаляет виртуального пользователя.


III. Приложения

Переход от PHP/FI 2.0 к PHP 3.0
Разработка PHP
Отладчик PHP

Приложение 0. Переход от PHP/FI 2.0 к PHP 3.0

Несовместимость в 3.0

PHP 3.0 полностью изменен. Его лексический анализатор стал намного более логичным и последовательным чем 2.0; версия 3.0 быстрее, и использует меньше ресурсов. Однако, некоторые усовершенствования повлекли частичную несовместимость в синтаксисе и функциональных возможностях.

Кроме того, в PHP 3.0 улучшен синтаксис и семантика, что также повлекло некоторую несовместимость. Однако, мы надеемся, что все эти усовершенствования к лучшему.

Эта глава поможет вам решить проблемы связанные с несовместимостью при переходе от PHP/FI 2.0 к PHP 3.0. Новые возможности здесь не рассматриваются.

Существует программа, которая может автоматически конвертировать старый PHP/FI 2.0 скрипт; вы можете найти ее в подкаталоге convertor дистрибутива PHP 3.0. Эта программа только отслеживает изменения синтаксиса, поэтому, в любом случае, вам придется прочитать эту главу внимательно.

Открывающий и закрывающий тэги

Первое, что вы вероятно заметите - это то что открывающий и закрывающий тэги PHP изменены. Старая <?> форма была заменена тремя новыми возможными формами:

Пример 0-1. Изменение: старые открывающий и закрывающий тэги:
<? echo "This is PHP/FI 2.0 code.\n"; >

Начиная с версии 2.0, PHP/FI поддерживает также следующий формат:

Пример 0-2. Изменение: новые открывающий и закрывающий тэги, первый вариант:
<? echo "This is PHP 3.0 code!\n"; ?>

Заметьте, что закрывающий тэг теперь состоит из знака вопроса и знака "больше" вместо только "больше". Однако, если Вы планируете использовать XML на вашем сервере, у вас будут проблемы с этим вариантом, так как PHP может попробовать исполнить разметку XML в документах XML как код PHP. Из-за этого, было внесено следующее изменение:

Пример 0-3. Изменение: новые тэги начала и конца, второй вариант:
<?php echo "This is PHP 3.0 code!\n"; ?>

Из-за проблем с редакторами, не поддерживающими инструкции обработки (например Microsoft FrontPage), были введены следующие изменения:

Пример 0-4. Изменение: новые тэги начала и конца, третий вариант:
<script language="php">

  echo "This is PHP 3.0 code!\n";

</script>

Синтаксис операторов if..endif

"Альтернативный" способ описания блока if/elseif/else, с использованием, if(); elseif (); else; endif; не мог быть эффективно осуществлен без серьезного усложнения компиллятора/интерпретатора, из-за этого его синтаксис был изменен:

Пример 0-5. Изменение: старый синтаксис if..endif:
if ($foo);
    echo "yep\n";
elseif ($bar);
    echo "almost\n";
else;
    echo "nope\n";
endif;
Пример 0-6. Изменение: новый синтаксис if..endif:
if ($foo):
    echo "yep\n";
elseif ($bar):
    echo "almost\n";
else:
    echo "nope\n";
endif;

Точки с запятой были заменены двоеточиями во всех операторах, за исключением завершающего блок (endif).

Синтаксис while

Точно так же как, с if..endif, был изменен синтаксис while..endwhile:

Пример 0-7. Изменения: старый, while..endwhile синтаксис:
while ($more_to_come);
    ...
endwhile;
Пример 0-8. Изменения: новый синтаксис while..endwhile:
while ($more_to_come):
    ...
endwhile;
Внимание!
Используя устаревший синтаксис в PHP 3.0 вы получите бесконечный цикл.

Типы выражений

В PHP/FI 2.0 использовалась левая часть выражения для определения типа результата. PHP 3.0 учитывает обе части выражения для определения типа результата; это может привести к неожиданным результатам работы скриптов 2.0.

Рассмотрите этот пример:

$a[0]=5;
$a[1]=7;

$key = key($a);
while ("" != $key) {
    echo "$keyn";
    next($a);
}

В PHP/FI 2.0 мы получили бы индексы $a. В PHP 3.0 мы не увидим ничего. Причина в том что в PHP 2.0, переменная в левой части выражения - строка; было выполнено сравнение, действительно "" не равно "0", и цикл был пройден. В PHP 3.0, при выполнении операции сравнения строковой и целочисленных переменных, строка будет преобразована в целое число и далее аргументы сравниваются как целые. Это означает в данном случае, что сравненивается значение функции atoi("") которое равно 0, и variablelist которое также равно 0; цикл не выполняется ни разу.

Исправить это достаточно просто. Замените начало на:

while ((string)$key != "") {

Изменены сообщения об ошибках

Сообщения об ошибках PHP 3.0, как правило, точнее чем в 2.0. Вместо указания фрагмента кода, вызвавший ошибку, вы получаете имя файла и номер строки.

Сокращенная операция вычисления логических выражений

В PHP 3.0 используется метод сокращенного вычисления логических выражений. Это означает что в выражении (1 || test_me()), функция test_me() не вызывается, так как результат функции уже не сможет изменить результат этого логического выражения.

Эта незначительная, на первый взгляд, проблема совместимости может приести к неожиданным последствиям.

Значения true/false, возвращаемые функциями

Большинство внутренних функции были переписаны; теперь они возвращают TRUE, в случае удачи и FALSE в противном случае, тогда как в PHP/FI 2.0 возвращаются 0 и -1 соответственно. Эти новые возможности позволяют создавать более логичный код, такой так $fp = fopen("/your/file") or fail("darn!");. Так как PHP/FI 2.0 не имел четких правил, относительно того, что должна вернуть функция в случае неудачи, в большинстве случаев скрипты использующие подобные функции должны быть проверены вручную после проверки конвертером.

Пример 0-9. Изменения 2.0: возвращаемые значения, старый код:
$fp = fopen($file, "r");
if ($fp == -1);
    echo("Could not open $file for reading<br>\n");
endif;
Пример 0-10. Изменения 2.0: возвращаемые значения, новый код:
$fp = @fopen($file, "r") or print("Could not open $file for reading<br>\n");

Прочие изменения

  • Модуль Apache в PHP 3.0 не поддерживает Apache версий до 1.2. - необходима версия Apache 1.2, или более поздняя.
  • echo() больше не поддерживает строку формата. Используйте printf().
  • В PHP/FI 2.0, вызов $foo[0] имел тот же эффект как и $foo. Это устранено в PHP 3.0.
  • Чтение массивов в виде $array[] больше не поддерживается

    То есть вы не можете читать массив в цикле, выполняющем $data = $array[]. Используйте current()и next().

    Кроме того, выражение $array1[] = $array2 не добавляет значения массива $array2 к $array1, но добавляет $array2 как последний элемент $array1. См. также поддерку многомерных массивов.

  • "+" Больше не используется как оператор сложения для строковых переменных, вместо этого они преобразовываются к целочисленным и выполняется операция сложения. Используйте ".".
Пример 0-11. Изменения 2.0: сложение для строковых переменных
echo "1" + "1";

В PHP 2.0 значение этого выражения - 11, а в PHP 3.0 - 2. Используйте вместо него:

echo "1"."1";
$a = 1;
$b = 1;
echo $a + $b;

Значение этого выражения = 2 для PHP 2.0 и 3.0.

$a = 1;
$b = 1;
echo $a.$b;

Это выражение вернет 11 в PHP 3.0.

Приложение 0. Программирование на PHP

Добавление функций в PHP3

Прототип функции

Все функции выглядят следующим образом:

void php3_foo(INTERNAL_FUNCTION_PARAMETERS) {

}

Это общий вид функции, даже если она не имеет аргументов.

Аргументы

Аргументы всегда имеют тип pval. Этот тип представляет собой объединение (union), в котором содержится фактический тип аргумента. В том случае, если ваша функция принимает несколько аргументов, вы можете сделать что-нибудь вроде этого в начале вашей функции:

Пример 0-1. Объявление переменных:
pval *arg1, *arg2;
if (ARG_COUNT(ht) != 2 || getParameters(ht,2,&arg1,&arg2)==FAILURE) {
   WRONG_PARAM_COUNT;
}

Обратите внимание: аргументы могут быть по значению или по ссылке. В любом случае вы должны передать &(pval *) в getParameters. Если вы хотите проверить, был ли параметр передан ссылкой или нет, вы можете использовать функцию ParameterPassedByReference(ht,n), она вернет 1 или 0.

Если изменяете один из параметров, переданный по ссылке или по значению, вы можете вызвать pval_destructor, или, в том случае, если это массив, вы можете использолвать функцию, подобную одной из internal_functions.h, в котоых return_value является массивом.

Если вы собираетесь преобразовывать параметр к IS_STRING - сначала создайте новую строку с помощью estrdup() и укажите ее длину, только после этого преобразуйте к IS_STRING. Если вы изменяете строку параметра уже являющегося IS_STRING или IS_ARRAY, сначала придется использовать pval_destructor.

Функции с переменным числом аргументов

Функция может принимать неопределенное количество аргументов. Например, в случае, если ваша функция принимает два или три аргумента, можно использовать следующий код:

Пример 0-2. Функции, принимающие несколько аргументов
pval *arg1, *arg2, *arg3;
int arg_count = ARG_COUNT(ht);

if (arg_count < 2 || arg_count > 3 ||
    getParameters(ht,arg_count,&arg1,&arg2,&arg3)==FAILURE) {
    WRONG_PARAM_COUNT;
}

Использование аргументов функции

Тип каждого аргумента означен в поле type структуры pval. Этот тип может быть любым из приведенных ниже:

Таблица 0-1. Типы переменных PHP

IS_STRING | String
IS_DOUBLE | Double-precision floating point
IS_LONG | Long integer
IS_ARRAY | Array
IS_EMPTY | None
IS_USER_FUNCTION | ??
IS_INTERNAL_FUNCTION | ?? (если не может быть передана в функцию - удаляется)
IS_CLASS | ??
IS_OBJECT | ??

Если вы получаете аргумент одного типа и хотели бы использовать его как аргумент другого типа, или если вы хотите жестко определить тип аргумента - используйте одну из преобразующих функций:

convert_to_long(arg1);
convert_to_double(arg1);
convert_to_string(arg1);
convert_to_boolean_long(arg1);  /* Если строка равна "" или "0" возвращает 0, во всех иных случаях 1 */
convert_string_to_number(arg1);  /* Преобразует строку к LONG или DOUBLE в зависимости от содержания */

Эти функции только выполняют преобразование аргумента, они не возвращают значений.

Тип переменной обозначается в объединении:

  • IS_STRING: arg1->value.str.val
  • IS_LONG: arg1->value.lval
  • IS_DOUBLE: arg1->value.dval

Управление памятью в функциях

Память, необходимая внутри функции, должна быть зарезервирована функциями emalloc() или estrdup(). Это функции управления памятью, которые выглядят и работают как обычные malloc() и strdup(). Память освобождается с помощью efree().

В программе могут быть использованы два вида памяти: область памяти, которая будет использована переменными, и временная память для функций. Когда вы присваиваете строковое значение переменной первого типа, вы должны предварительно выделить область памяти при помощи emalloc() or estrdup(). Вы НЕ должны освобождать эту память, если только вы не переписываете знаение переменной в той же функции (это считается не очень хорошим стилем программирования).

Для работы с временной/постоянной памятью необходимо использовать три функции: emalloc(), estrdup(), и efree(). Они работают ТАКЖЕ как их "двойники". Память, выделенную с помощью emalloc() или estrdup() вы должны освободить с помощью efree(), иначе область памяти будет утеряна. Под словами "также, как двойники" мы имеем в виду следующее: если вы пытаетесь освободить память, которая не была выделена с помощью emalloc() или estrdup() вы скорее всего получите ошибку сегментации (segmentation fault). Поэтому будьте внимательны и не забывайте освобождать память после использования.

Если вы выполняете компиляцию с опцией "-DDEBUG", PHP3 выдаст список всех блоков памяти, которые были выделены м помощью emalloc() или estrdup(), но не будут освобождены после завершения скрипта.

Установка переменных в таблице символов

Для упрощения доступа к переменным в таблице символов определены следующие макросы:

  • SET_VAR_STRING(имя,значение) [1]

  • SET_VAR_DOUBLE(имя,значение)

  • SET_VAR_LONG(имя,значение)

[1]

Таблицы символов в PHP 3.0 реализованы в виде хэш-таблиц (hash table). В любой момент времени, &symbol_table указывает на 'главную' таблицу символов, а active_symbol_table указывает на активную в данный момент (они идентичны при запуске, или различны - внутри функции).

Следующие примеры используют 'active_symbol_table'. Вам придется заменить это на &symbol_table ели вы хотите работать с 'главной' таблицей символов. Те же самые функции можно применять и к массивам,как показано ниже.

Пример 0-3. Проверка наличия $foo в таблице символов
if (hash_exists(active_symbol_table,"foo",sizeof("foo"))) { существует... }
else { не существует }
Пример 0-4. Вычисление размера переменной в таблице символов
hash_find(active_symbol_table,"foo",sizeof("foo"),&pvalue);
check(pvalue.type);

В PHP 3.0 маcсивы реализованы с использованием тех же хэш-таблиц, что и в таблицах символов. Это означает что приведенные функции можно использовать и для проверки переменных внутри массивов.

В том случае, если вы хотите определить новое множество в таблице символов:

Сначала, вы можете проверить наличие, используя hash_exists() или hash_find().

Потом инициализируйте множество:

Пример 0-5. инициализация нового множества
pval arr;

if (array_init(&arr) == FAILURE) { failed... };
hash_update(active_symbol_table,"foo",sizeof("foo"),&arr,sizeof(pval),NULL);

Объявление нового (пустого) массива $foo в активной таблице символов.

Вот так вы можете добавить новые элементы:

Пример 0-6. Добавление элементов к массиву
pval entry;
entry.type = IS_LONG;
entry.value.lval = 5;

/* определяет $foo["bar"] = 5 */
hash_update(arr.value.ht,"bar",sizeof("bar"),&entry,sizeof(pval),NULL);

/* определяет $foo[7] = 5 */
hash_index_update(arr.value.ht,7,&entry,sizeof(pval),NULL);

/* определяет следующее свободное место в $foo[],
 * $foo[8], to be 5 (работает как и в php2)
 */
hash_next_index_insert(arr.value.ht,&entry,sizeof(pval),NULL);

Если вы хотите изменить значение, в хэш-таблице, вы должны сначала считать его. Для того чтобы избежать этого на верхнем уровне, вы можете добавлять pval ** к функции выполняющей добавление (обновление произойдет с адресом pval * добавляемого элемента). Если это значение NULL (как в приведенных примерах) - параметр будет проигнорирован.

hash_next_index_insert() использует примерно такую же логику как и "$foo[] = bar;" в PHP 2.0.

Если вы создаете новый массив с целью возврата его из функции, можно инициализировать его так же как в примере выше:

if (array_init(return_value) == FAILURE) { failed...; }

...и добавлять новые значения вспомогательными функциями:

add_next_index_long(return_value,long_value);
add_next_index_double(return_value,double_value);
add_next_index_string(return_value,estrdup(string_value));

Конечно, если добавление не было выполнено правильно после инициализации множества, вероятно вам понадобится проверить множество сначала:

pval *arr;

if (hash_find(active_symbol_table,"foo",sizeof("foo"),(void **)&arr)==FAILURE) { can't find... }
else { use arr->value.ht... }

Обратите внимание: hash_find получает лишь ссылку на указатель на pval, а не сам указатель на pval.

Практически любая hash-функция возвращает SUCCESS или FAILURE (hash_exists() возвращает булево значение).

Возврат значений простых типов

Для упрощения возврата значений из функций определены следующие макросы:

Макросы RETURN_* устанавливают значение возвращаемое значение функции и возвращают управление:

  • RETURN
  • RETURN_FALSE
  • RETURN_TRUE
  • RETURN_LONG(l)
  • RETURN_STRING(s,dup) если dup - true, дублирует строку
  • RETURN_STRINGL(s,l,dup) возвращает строку (s) определенной длины (l).
  • RETURN_DOUBLE(d)

Макросы RETVAL_* устанавливают возвращаемое значение, но не возвращает управление.

  • RETVAL_FALSE
  • RETVAL_TRUE
  • RETVAL_LONG(l)
  • RETVAL_STRING(s,dup) если dup - true, дублирует строку
  • RETVAL_STRINGL(s,l,dup) возвращает строку (s) определенной длины (l).
  • RETVAL_DOUBLE(d)

Все строковые макросы вызывают функцию estrdup() для переданного аргумента, поэтому вы можете спокойно освободить память, занятую под аргумент после выполнения макроса, или использовать статическую память.

Если ваша функция возвращает логическое значение, используйте RETURN_TRUE и RETURN_FALSE.

Возврат значений сложных типов

Ваша функция может также возвращать и сложные значения; такие как объект или массив.

Возвращение объекта:

  1. Вызвать object_init(return_value).
  2. Присвоить полям значения. Функции, доступные для этого, перечислены ниже.
  3. Возможно, зарегистрировать функции для данного объекта. Для того, чтобы иметь доступ к данным объекта, функция должна получить значение "this" из active_symbol_table. Его типом является IS_OBJECT. По сути, это обычная хэш-таблица, т.е. вы можете использовать хэш-функции с полем .value.ht.

Регистрация метода выполняется следующим образом:

add_method( return_value, function_name, function_ptr );

Функции для добавления полей(свойств):

  • add_property_long( return_value, property_name, l ) - Добавляет поле 'property_name', типа long
  • add_property_double( return_value, property_name, d ) - То же, тип double
  • add_property_string( return_value, property_name, str ) - То же, тип string
  • add_property_stringl( return_value, property_name, str, l) - То же, тип string длиной 'l'

Возвращение массива:

  1. Вызвать array_init(return_value).
  2. Присвоить значения. Функции доступные для этой цели перечислены ниже.

Функции для добавления элементов:

  • add_assoc_long(return_value,key,l) - добавить значение, ассоциированое с ключом 'key' типа long
  • add_assoc_double(return_value,key,d)
  • add_assoc_string(return_value,key,str)
  • add_assoc_stringl(return_value,key,str,length) - указывается длина строки
  • add_index_long(return_value,index,l) - добавить значение элемента 'index' типа long
  • add_index_double(return_value,index,d)
  • add_index_string(return_value,index,str)
  • add_index_stringl(return_value,index,str,length) - указывается длина строки
  • add_next_index_long(return_value,l) - добавляется элемент массива в свободное место, тип long
  • add_next_index_double(return_value,d)
  • add_next_index_string(return_value,str)
  • add_next_index_stringl(return_value,str,length) - указывается длина строки

Использование списка ресурсов

В PHP 3.0 имеется стандартные методы для работы с разными типами ресурсов. Это сделано для замены локально связанных списков в PHP 2.0.

Доступные функции:

  • php3_list_insert(ptr, type) - возвращает идентификатор 'id' только что добавленного ресурса
  • php3_list_delete(id) - удаляет ресурс с идентификатором id
  • php3_list_find(id,*type) - возвращает указатель на ресурс, заданный идентификатором id, обновляет тип

Обычно эти функции используются драйверами SQL, хотя и могут используваться в любом другом месте, например, при работе с файловыми дескрипторами.

Пример работы с этими функциями показан ниже.

Пример 0-7. Добавление нового ресурса
RESOURCE *resource;

/* ...выделение памяти под ресурс и создание его... */
/* добавление ресурса в список */
return_value->value.lval = php3_list_insert((void *) resource, LE_RESOURCE_TYPE);
return_value->type = IS_LONG;
Пример 0-8. Использование существующего ресурса
pval *resource_id;
RESOURCE *resource;
int type;

convert_to_long(resource_id);
resource = php3_list_find(resource_id->value.lval, &type);
if (type != LE_RESOURCE_TYPE) {
    php3_error(E_WARNING,"ресурс с номером %d: неправильный тип",resource_id->value.lval);
    RETURN_FALSE;
}
/* ...использование ресурса... */
Пример 0-9. Удаление ресурса
pval *resource_id;
RESOURCE *resource;
int type;

convert_to_long(resource_id);
php3_list_delete(resource_id->value.lval);

Типы ресурсов должны быть зарегистрированы в php3_list.h в списке list_entry_type. Кроме того, вы должны написать деструктор для каждого типа ресурсов в list_entry_destructor() файла list.c. Если вы не предпринимаете никаких дополнительных действий в деструкторе, вы должны добавить пустой деструктор.

Использование таблиц постоянных ресурсов

В PHP 3.0 существует методы хранения постоянных ресурсов (ресурсов, которые сохраняются между вызовами). Один из модулей, который использует эту возможность - модуль MySQL, а также mSQL; вы можете изучить правила использования постоянных ресурсов читая код mysql.c. Следует обратить внимание на функции:

php3_mysql_do_connect
php3_mysql_connect()
php3_mysql_pconnect()

Основная идея таблиц постоянных ресурсов заключается в следующем:

  1. Программируется модуль для работы с обычными списками ресурсов (см. секцию 9)
  2. Программируется дополнительные функции связи, которые проверяют, существует ли ресурс в таблице постоянных ресурсов. Если да, он регистрируется как в обычном списке ресурсов указателем на таблицу постояннвых ресурсов. После этого все должно заработать (см. 1.). Если ресурса не существует, тогда необходимо создать его, добавить в таблицу постоянных ресурсов и добавить указатель на нее в таблицу обчных ресурсов.

Если вы откроете файл mysql.c, вы заметите, что переписывать ничего не пришлось, за исключением более сложных функций связи.

Существует набор функций для работы с таблицами постоянных ресурсов, в котором функции для работы с таблицами постоянных ресурсов аналогичны функциям для работы с обычными списками ресурсов. В этом случае 'list' заменяется на 'plist':

  • php3_plist_insert(ptr, type) - возвращает дескриптор созданного ресурса
  • php3_plist_delete(id) - удаляет ресурс с дескриптором id
  • php3_plist_find(id,*type) - возвращает указатель на ресурс с дескриптором id, устанавливает 'type'

Однако, эти функции могут оказаться бесполезными когда вы создаете постоянный модуль. Можно пользоваться тем, что постоянные таблицы ресурсов реализованы как хэш-таблицы. Например, в модулях MySQL/mSQL, когда вызывается pconnect(), создается строка на основе имени хоста, имени пользователя и его пароля и эта строка помещается в хэш-таблицу как ключ. В следующий раз когда будет вызвана pconnect() с теми же параметрами хоста, пользователя и пароля, будет сгенерирован тот же самый ключ и SQL-связь будет найдено в списке постоянных ресурсов.

Чтобы более полно понять работу функций plist* с хэш-таблицами ознакомтесь с файлами mysql.c или msql.c.

Внимание: ресурсы, предназначеные для таблицы постоянных ресурсов НЕ ДОЛЖНЫ создаваться с помощью менеджера памяти, т.е. они не должны быть созданы с использованием emalloc(), estrdup() и т.д. Вместо этого вы должные использовать обычные malloc(), strdup() и т.д. Причина этого проста: после исполнения запроса каждый участок памяти, выделенный меджером, удаляется. Следовательно не можете использовать менеджер памяти, так как список постоянных ресурсов не должен быть удален в конце сеанса.

Когда вы регистрите ресурс, который собираетесь добавить в таблицу постоянных, вы должны добавить деструкторы для них и в таблицу постоянных ресурсов, и обычных. Дескриптор в таблице обычных ресурсов должен быть пустым. Напротив, деструктор постоянного ресурса должен правильно освободить память, SQL-связи и т.д. Помните, что вы обязаны предусмотреть деструктор для любого типа ресурсов, даже если он будет пустым. Помните так же о том, что из-за того, что функции типа emalloc() не используются с постоянными ресурсами, вы не должны пользоваться в деструкторе функциями типа efree().

Директивы времени выполнения (runtime)

Многие возможности PHP3 могут быть сконфигурированы во время выполнения. Конфигурационные директивы могут быть либо в файле php3.ini, либо, в случае использования Apache, в файлах .conf модуля Apache. Преимущесво использования файлов .conf модуля Apache заключается в том, что в этом случае можно предусмотреть настройки для каждого каталога в отдельности. Эта возможность особенна полезна когда сервер поддерживает несколько виртуальных хостов.

Ниже описаны действия, которые необходимо предпринять для добавления директивы:

  1. Добавьте директиву в секцию php3_ini_structure в mod_php3.h.
  2. В файле main.c, отредактируйте функцию php3_module_startup и добавьте подходящие вызовы cfg_get_string() или cfg_get_long().
  3. Добавьте директиву, ограничения и комментарий в структуру php3_commands в mod_php3.c. Заметьте, что только RSRC_CONF-директивы могут присутствовать в .conf файлах Apache. Директивы OR_OPTIONS могут присутствовать где угодно, включая файлы .htaccess.
  4. В php3take1handler() или в php3flaghandler() добавьте подходящую вашей директиве запись.
  5. В разделе конфигурации функции _php3_info() в info.c необходимо добавить директиву.
  6. После этого, естественно, вы должны использовать вашу директиву где-либо. Вызвать ее можно с помощью php3_ini.directive.

Вызов пользовательских функций

Для вызова пользовательских функций из внутренней нужно использовать call_user_function().

Функция call_user_function() возвращает SUCCESS в случае успеха, и FAILURE в том случае если функция не найдена. Вы должны проверить возвращенное значение! Если возврашен SUCCESS, вы отвечаете за удаление retval и pval. В случае возврата FAILURE, значение retval не определено.

Все внутренние функции должны быть сконструированы так, чтобы возможно было повторное использование ее. Это в частности означает, что в них не должны использоваться глобальные или статические переменные.

Функция call_user_function() принимает шесть аргументов:

HashTable *function_table

Хэш-таблица в которой производится поиск функции.

pval *object

Указатель на объект, с которым вызывается функция. NULL если вызывается глобальная функция. В первом случае аргумент function_table игнорируется и берется и определяется из объекта. Объект может быть изменен функцией (внутри функции он доступен через указатель $this). Если вы не хотите, чтобы это произошло, передайте копию объекта.

pval *function_name

Имя вызываемой функции. Должно быть pval IS_STRING со значениями function_name.str.val и function_name.str.len установленными соответственно. Значение function_name изменяется вызовом call_user_function() - конвертируется в нижний регистр (прописные буквы). Если вы этого не хотите, передайте копию имени функции.

pval *retval

Указатель на структуру pval, в которую записывается возвращаемое функцией значение. Структура должна быть создана заранее, call_user_function() сама по себе не создает ничего.

int param_count

Число параметров, передаваемое функции.

pval *params[]

Массив указателей на значения, которые передаются в вызываемую функцию; первый аргумент имеет смещение 0, второй 1 и т.д. Массив является массивом указателей на pval. Аргументы пересылаются по ссылке, из чего следует, что если функция меняет аргумент, меняется и первоначальное значение. Опять же, если вы хотите этого избежать, передайте ссылку на копию объекта.

Сообщения об ошибках

Чтобы выдать сообщение об ошибке внутри функций вы должны использовать функкцию php3_error(). Она принимает как минимум два параметра -- первый это категория ошибки, второй - форматирующая строка (как в стандартной функции printf()), за которым могут следовать аргументы форматирующей строки. Ниже представлены категории ошибок:

E_NOTICE

Сообщения этого типа по умолчанию не выводятся и сигнализируют о том, что в скрипте произошло что-то, что может означать ошибку, но может случится и при нормальном исполнении скрипта. Примерами могут служить попытка обращения к переменной, значение которой не определено, или вызов stat() для несуществующего файла.

E_WARNING

Сообщения этого типа выводятся, но не прерывают выполнение скрипта. Они сообщают, что существует ошибка, которая должна быть отслежена скриптом до того, как будет сделан вызов. Примером служит вызов ereg() с неправильным регулярным выражением.

E_ERROR

Сообщения этого типа также выводятся по умолчанию, и выполнение скрипта прекращается. Они означают неустранимые ошибки, такие как невозможность выделения памяти.

E_PARSE

Ошибки данного класса генерируются исключительно синтаксическим анализатором. Этот класс ошибок приведен здесь исключительно для полноты изложения.

E_CORE_ERROR

То же, что и E_ERROR, за исключением того, что генерируются ядром PHP. В функциях не должны генерироваться сообщения данного типа.

E_CORE_WARNING

То же, что и E_WARNING, за исключением того, что генерируются ядром PHP. В функциях не должны генерироваться сообщения данного типа.

Взгляд вглубь PHP

Приложение 0. Отладчик PHP

Использование отладчика

Отладчик PHP полезен при отслеживании неочевидных ошибок. Он работает через TCP порт каждый раз, когда стартует PHP. Все сообщения об ошибках из запроса будут посланы по этому TCP соединению. Информация этого раздела нужна при работе с такими редакторами как Emacs, или в интегрированной среде разработки (IDE).

Действия по установке отладчика:

  1. Задайте порт TCP, который будет использоваться отладчиком в php3.ini (debugger.port) и разрешите его использование ( debugger.enabled).
  2. Установите пассивный сокет на этот порт (например, командой socket -l -s 1400 в UNIX).
  3. Внутри вашего кода запустите debugger_on(host), где host - запустите IP-адрес хоста, на котором запущен пассивный сокет.

Теперь все предупреждения, замечания и т.д. будут показаны на этом сокете, даже если вы выключили error_reporting().

Протокол отладчика

Протокол отладчика основан на отдельных строках. Каждая строка имеет свой тип; несколько строк могут составлять сообщение. Каждое сообщение начинается со строки с типом start и заканчивается строкой с типом end. PHP может посылать строки с несколькими сообщениями одновременно.

Строка имеет следующий формат:

date time host(pid) type: message-data

date
Дата в формате ISO 8601 (yyyy-mm-dd)
time
Время, включая микросекунды: hh:mm:uuuuuu
host
Имя DNS или IP-адрес хоста, где было сгенерировано сообщение об ошибке.
pid
PID (id процесса) на хосте host процесса исполнившего скрипт PHP в котором произошла ошибка.
type
Тип строки. Сообщает получающей программе как трактовать содержимое строки:

Таблица 0-1. Типы строк отладчика

Тип

Значенне

start | Сообщает получающей программе, что в этом месте начинается сообщение. Содержимое строки data содержит тип сообщения об ошибке (см. ниже).
message | Сообщение об ошибке.
location | Имя файла и номер строки, содержащей ошибку. Первая строка location содержит местоположение, data содержит информацию file:line. Строка location всегда следует после строки message и function.
frames | Число кадров в дампе стека. Если их четыре, ожидается информация о четырех уровнях вызываемых функций. Если эта строка отсутствует, глубина предполагается нулевой (ошибка произошла на высшем уровне вложенности).
function | Имя функции, содержащей ошибку. Повторяется один раз для каждого уровня в стеке вызовов функции.
end | Сообщает получающей программе, что сообщение отладчика закончено.
data
Данные строки.

Таблица 0-2. Типы ошибок отладчика

Отладчик | Внутренняя в PHP
warning | E_WARNING
error | E_ERROR
parse | E_PARSE
notice | E_NOTICE
core-error | E_CORE_ERROR
core-warning | E_CORE_WARNING
unknown | (любая другая)
Пример 0-1. Пример сообщения об ошибке

1998-04-05 23:27:400966 lucifer.guardian.no(20481) start: notice
1998-04-05 23:27:400966 lucifer.guardian.no(20481) message: Uninitialized variable
1998-04-05 23:27:400966 lucifer.guardian.no(20481) location: (null):7
1998-04-05 23:27:400966 lucifer.guardian.no(20481) frames: 1
1998-04-05 23:27:400966 lucifer.guardian.no(20481) function: display
1998-04-05 23:27:400966 lucifer.guardian.no(20481) location: /home/ssb/public_html/test.php3:10
1998-04-05 23:27:400966 lucifer.guardian.no(20481) end: notice